子集基于粒度和平均值

时间:2014-03-18 13:17:42

标签: r subset mean

我有大的data-frame由两列组成。我想计算第一列的每个子集的第二列值的平均值。第一列的子集基于指定的粒度。例如,对于以下data-framedf,我想计算每个df$B子集的df$A值的平均值,每个子集的增量(粒度)为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
}

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

1 个答案:

答案 0 :(得分:1)

我会使用findInterval进行子集选择(在您的示例中,每个ceiling值的简单A也应该足够。但如果您的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