查找列中具有不同值的对象的平均值

时间:2012-11-28 14:21:06

标签: r

我是R的新手(之前曾使用过MATLAB)并且已经尝试了很长时间来寻找解决方案,但是我找不到一个这个(貌似)非常简单的问题。这是问题所在;

在第一列中,我有几天的时间值(在此示例中简化),在第二列中,我有我想要平均的值。我想要做的是获取属于同一时间和平均值的所有值。我在相当大的数据集上执行此操作,因此自动执行此操作会有很大帮助。

让我们设置:

time = rep( c("00:00", "00:10", "00:20", "00:30", "00:40", "00:50", "01:00", "01:10"), 5)
values = c(sample(1:100, 40))
data = cbind(time, values)

所以现在我的矩阵有时间&其中的值和我想将所有具有(例如)“00:00”的值分组并计算其平均值。经过一番搜索,我发现aggregate()函数可以很好地帮助,所以我做了以下几点;

aggregate(as.numeric(data[,-1]), by = list(sort(data[,1])), mean) 

有输出

    Group.1    x
1   00:00 77.2
2   00:10 59.2
3   00:20 51.0
4   00:30 49.4
5   00:40 51.4
6   00:50 33.4
7   01:00 33.8
8   01:10 51.6

所以它似乎工作得很好但是当我手工计算它时,值的平均值都是不同的。 (例如; 00:00:(56 + 3 + 91 + 71 + 8)/ 5 = 45.8而不是77.2),谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:2)

@joran的建议(不要通过排序来扰乱by变量)似乎有效:

set.seed(101) ## for reproducibility
time = rep( c("00:00", "00:10", "00:20", "00:30", 
      "00:40", "00:50", "01:00", "01:10"), 5)
values = c(sample(1:100, 40))
data = cbind(time, values)
aggregate(as.numeric(data[,2]),by=list(factor(data[,1])), mean)
##   Group.1    x
## 1   00:00 50.0
## 2   00:10 29.0
## 3   00:20 45.0
## 4   00:30 60.2
## 5   00:40 48.8
## 6   00:50 57.2
## 7   01:00 37.2
## 8   01:10 56.2
##

检查第一组:

mean(as.numeric(data[data[,1]=="00:00","values"]))
## [1] 50

作为进一步的建议,我强烈建议使用data.frame而不是cbind()列 - 这样您就可以将时间和数值放在一起而无需获取它们所有人都被强迫进入同一类型。

(使用内置时间对象也会很好:我从times包中尝试了chron但是没有完全掌握它的内容。

dat <- data.frame(time,values)  ## avoid using "data" as a variable name
aggregate(values~time, data=dat, mean)

更容易阅读。

顺便说一下,Stack Overflow上有很多帖子比较各种汇总解决方案(byaggregateddply和来自plyr包的朋友,和data.table包裹):例如Elegant way to solve ddply task with aggregate (hoping for better performance)R: speeding up "group by" operationsHow to speed up summarise and ddply? ...

答案 1 :(得分:1)

by是你的朋友:

by(as.numeric(data[,"values"]),data[,"time"],mean)

答案 2 :(得分:0)

我建议使用as.factor()将索引变量(时间)设置为一个因子。

然后将其用作索引,即:aggregate(data$values,by=list(data$time.factor),FUN=mean)