2013-04-09 61 views
2

我有一个数据帧,它具有以下结构和两列data1data2。下面是样本数据:查看列表中每1000000个列的平均值R

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的平均值为每百万计数data1。 这意味着它应该给出前2行的平均值,然后是下3行,然后是下3行,等等......

输出应该是一个数据帧,其中最后一个值在间隔1000000内,在该区间data2值:示例输出如下所示:

800030 0.97826087 
1687492 0.38389110 
2959087 0.04204981 

能有所帮助R中做到这一点?

+0

就像一个念头:我不知道你在做什么,但你不是在计算一个加权平均值吗?即对于前面的1e6次观测,意思是(1 * 0.8e6 + 0.95 ... * 30 + 0.48 ... * 199970)/ 1e6。这将是第一个1e6计数的平均值,而不是前3个不同结果的平均值。 – 2013-04-09 12:34:26

回答

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 

编辑:

c(seq(0, max(df$data1), by=1000000),max(df$data1)) 

编辑2:要自动计算breaksseq,你可以像更换c(0,1000000,2000000,3000000)以下使用来自plyrddply将返回数据帧中的均值和最大值我:

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 
+0

感谢您的回答。但是这是样本数据,原始数据有更多的行,这使得难以按照代码“c(0,1000000,2000000,3000000)”的顺序对它们进行分组。 – chas 2013-04-09 09:12:27

+0

刚刚更新了我的答案,以便自动计算中断的方式。 – juba 2013-04-09 09:15:47

+0

:这正是我需要的。 outptu是一个数组,其坐标data1和data2的平均值,即(0,1e + 06] 0.81247926。有可能获得区间内的最大值和平均值作为数据帧? – chas 2013-04-09 11:26:40

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 
+0

谢谢。我不希望所有的数值都是平均值的计算值。只有平均值的区间内的最终值或最大值计算是必需的。 – chas 2013-04-09 11:35:38

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)