gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:21:49 28 4
gpt4 key购买 nike

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

最佳答案

@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 包的 friend ):例如 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? ...

关于r - 查找列中具有不同值的对象的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607225/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com