在一个组中计算子集的平均值

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
3个回答

12

试试这个:

aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)

5
如果您有一个大型数据集,您可能还想了解 data.table 包。将 data.frame 转换为 data.table 很容易。
示例:

较大的数据集

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 

Matthew的更新:由于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 

0

使用您的原始方法,但打字较少:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接