我有一个数据框,其结构如下,有两列data1
和data2
。以下是样本数据:
data1 data2
800000 1
800030 0.956521739130435
1000000 0.480916030534351
1686626 0.496
1687492 0.174757281553398
2148463 0.0344827586206897
2850823 0.05
2959087 0.0416666666666667
我想计算data2
中每1000000个计数的第二行的平均值data1
。
这意味着它应该给出前2行然后接下来3行的平均值,然后是接下来的3行,依此类推...
输出应该是一个数据帧,其最后一个值在区间1000000内,并且该区间内的平均值为data2
:示例输出如下所示:
800030 0.97826087
1687492 0.38389110
2959087 0.04204981
在R?
中可以做一些帮助吗?答案 0 :(得分:5)
假设您的数据位于data.frame DF
中,您可以使用aggregate
函数执行此操作
> with(DF, aggregate(data2, by=list((data1+0.01)%/%1000000), mean ))
Group.1 x
1 0 0.97826087
2 1 0.38389110
3 2 0.04204981
要获取计算mean
的列中的值,您必须再次使用aggregate
- 这次是data1
列本身。之后,您可以merge
两个结果数据帧。
res <- with(DF, merge(aggregate(data1, by = list((data1 + 0.01)%/%1e+06), paste), aggregate(data2, by = list((data1 + 0.01)%/%1e+06), mean), by = "Group.1"))
names(res) <- c("Group", "Values", "Mean")
res
## Group Values Mean
## 1 0 800000, 800030 0.97826087
## 2 1 1000000, 1686626, 1687492 0.38389110
## 3 2 2148463, 2850823, 2959087 0.04204981
答案 1 :(得分:3)
您可以这样做:
group <- cut(df$data1, c(0,1000000,2000000,3000000))
tapply(df$data2, group, mean)
# (0,1e+06] (1e+06,2e+06] (2e+06,3e+06]
# 0.81247926 0.33537864 0.04204981
编辑:要自动计算breaks
中的seq
,您可以使用以下内容替换c(0,1000000,2000000,3000000)
:
c(seq(0, max(df$data1), by=1000000),max(df$data1))
编辑2:以下内容使用ddply
中的plyr
,将在数据框中返回均值和最大值:
group <- cut(df$data1, c(seq(0, max(df$data1), by=1000000),max(df$data1)))
ddply(df, .(group), summarize, mean=mean(data2), max=max(data2))
# group mean max
# 1 (0,1e+06] 0.81247926 1.000
# 2 (1e+06,2e+06] 0.33537864 0.496
# 3 (2e+06,2.96e+06] 0.04204981 0.050
答案 2 :(得分:2)
为了多样性,这是使用split
的另一种解决方案:
sapply(split(df,df$data1%/%1e6), function(x)mean(x$data2))
0 1 2
0.97826087 0.38389110 0.04204981
修改:甚至更简单:
sapply(split(df$data2,df$data1%/%1e6), mean)