【问题标题】:Finding mean values of objects with different values in column查找列中具有不同值的对象的平均值
【发布时间】:2012-11-28 14:21:05
【问题描述】:

我是 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),谁能告诉我我做错了什么?

【问题讨论】:

  • 您对通过by = ... 传递的索引变量进行了排序,这扰乱了时间和值之间的关联。
  • 感谢您的建议?您建议的正确方法是什么?
  • 谢谢!第一个问号不是故意的,有点着急。

标签: r


【解决方案1】:

@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()ing 您的列 - 这允许您将时间和数值放在一起,而不会将它们全部强制到同类型。

(也可以使用内置的时间对象:我尝试了 chron 包中的 times,但没有完全掌握它)

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" operations , How to speed up summarise and ddply? ...

【讨论】:

  • 非常感谢!我想我不确定要寻找什么,其他问题也会有所帮助!感谢您的建议,将应用这个!
【解决方案2】:

by是你的朋友:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 时间不一定是这个工作的一个因素。另请参阅聚合公式表示法。
    • 我试过了,但它仍然没有给正确的遮阳篷,虽然aggregate(as.numeric(data[,2]),by=list(factor(data[,1])), mean)
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多