9

我想计算每个“天”的平均值,但要计算一天中的一部分(时间=12-14)。这段代码对我有用,但我必须每天输入一行新代码,这将达到数百行。

这似乎应该很简单。当分组变量相同时,我很容易做到这一点,但当我不想包含当天的所有值时,我不知道该怎么做。有一个更好的方法吗?

sapply(sap[sap$Day==165 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)

sapply(sap[sap$Day==166 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)

数据如下所示:

Day Time    StomCond_Trunc
165 12      33.57189926
165 12.1    50.29437636
165 12.2    35.59876214
165 12.3    24.39879768
4

3 回答 3

12

尝试这个:

aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)
于 2012-02-18T16:41:25.770 回答
5

如果您有一个大型数据集,您可能还想查看该data.table包。将 a 转换data.frame为 adata.table非常简单。

例子:

大型(ish)数据集

df <- data.frame(Day=1:1000000,Time=sample(1:14,1000000,replace=T),StomCond_Trunc=rnorm(100000)*20)

在上使用聚合data.frame

>system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean))
   user  system elapsed 
 16.255   0.377  24.263

将其转换为data.table

 dt <- data.table(df,key="Time")

>system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day])
   user  system elapsed 
  9.534   0.178  15.270 

从马修更新。由于 data.table 1.8.2 中的新优化功能,该时间已显着改善。

使用 R 2.15.1 中的 data.table 1.8.2 重新测试两种方法之间的差异:

df <- data.frame(Day=1:1000000,
                 Time=sample(1:14,1000000,replace=T),
                 StomCond_Trunc=rnorm(100000)*20)
system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean)) 
#   user  system elapsed 
#  10.19    0.27   10.47

dt <- data.table(df,key="Time") 
system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day]) 
#   user  system elapsed 
#   0.31    0.00    0.31 
于 2012-02-19T00:07:45.063 回答
0

使用您原来的方法,但输入更少:

sapply(sap[sap$Day==165 & sap$Time %in% seq(12, 14, 0.1), ],mean)

然而,这只是比你原来的方法稍微好一点的方法。它不像其他答案那样灵活,因为它取决于时间值的 0.1 增量。其他方法不关心增量大小,这使它们更加通用。我会推荐@Maiasaura 的回答data.table

于 2012-03-24T08:04:22.517 回答