【问题标题】:Subset based on granularity and average values基于粒度和平均值的子集
【发布时间】:2014-03-18 21:56:10
【问题描述】:

我有大data-frame 由两列组成。我想计算第一列的每个子集的第二列值的平均值。第一列的子集基于指定的粒度。例如,对于以下data-framedf,我想计算df$A 的每个子集的df$B 值的平均值,每个子集的增量(粒度)为1。结果应该在两个新列中。

A       B            expected results     newA      newB
0.22096 1                                  0         1.142857
0.33489 1                                  1         2
0.33655 1                                  2         4
0.43953 1
0.64933 2
0.86668 1
0.96932 1
1.09342 2
1.58314 2
1.88481 2
2.07654 4
2.34652 3
2.79777 5

这是一个简单的例子,我不知道如何循环整个data-frame 并执行计算,即df$B 的平均值。

在下面尝试了子集,但不知道如何附加结果并创建最终结果:

试过类似的东西:

increment<-1
mx<-max(df$A)
i<-0

newDF<-data.frame()
while(i < mx){
    tmp<-subset(df, (A >i & A< (i+increment)))
    i<-i+granualrity
}

不确定逻辑。但我确信有一种简短的方法可以进行所需的计算。有什么想法吗?

【问题讨论】:

    标签: r subset mean


    【解决方案1】:

    我将使用findInterval 进行子集选择(在您的示例中,每个A 值的简单ceiling 也应该足够了。但是如果您的increment 与1 不同,则需要findInterval。 ) 和tapply 来计算mean

    df <- read.table(textConnection("
    A       B
    0.22096 1
    0.33489 1
    0.33655 1
    0.43953 1
    0.64933 2
    0.86668 1
    0.96932 1
    1.09342 2
    1.58314 2
    1.88481 2
    2.07654 4
    2.34652 3
    2.79777 5"), header=TRUE)
    
    ## sort data.frame by column A (needed for findInterval)
    df <- df[order(df$A), ]
    
    ## define granuality
    subsets <- seq(1, max(ceiling(df$A)), by=1) # change the "by" argument for different increments
    df$subset <- findInterval(df$A, subsets)
    
    tapply(df$B, df$subset, mean)
    #       0        1        2 
    #1.142857 2.000000 4.000000
    

    【讨论】:

    • 订单有什么不同吗?认为 df$A 已经订购了!!。是的,我想测试具有不同增量值的数据,即 0.1,1,我可以在其中指定增量。最后,如何将结果作为 2 列数据框!
    • @SimpleNEasy:如果您的数据(df$A 列)已经排序,您可以跳过order 调用。我只是出于安全原因使用它(也许您的玩具示例有一个有序列,但您的真实数据没有)。
    • 谢谢。但是如何更改增量值并将结果显示为 2 列而不是 2 行!
    • @SimpleNEasy:查看我编辑的代码。要将结果转换为data.frame,您可以使用类似d &lt;- as.data.frame(tapply(...))
    • 使用 as.data.frame() 总是给我一列,即(平均值),尽管包括间隔,例如这是一列数据框。 0 1.142857 1 2.000000 2 4.000000
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多