我有大的data-frame
由两列组成。我想计算第一列的每个子集的第二列值的平均值。第一列的子集基于指定的粒度。例如,对于以下data-frame
,df
,我想计算每个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
}
不确定逻辑。但我确信有一个简短的方法来进行所需的计算。有什么想法吗?
答案 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