ste*_*eph 7 aggregate r data.table
我想计算每个"日"的平均值,但是在一天的一部分时间(时间= 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)
Run Code Online (Sandbox Code Playgroud)
这是数据的样子:
Day Time StomCond_Trunc
165 12 33.57189926
165 12.1 50.29437636
165 12.2 35.59876214
165 12.3 24.39879768
Run Code Online (Sandbox Code Playgroud)
Jam*_*mes 11
试试这个:
aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)
Run Code Online (Sandbox Code Playgroud)
如果您有一个大型数据集,您可能还需要查看data.table
包。将 a 转换data.frame
为 adata.table
非常容易。
例子:
df <- data.frame(Day=1:1000000,Time=sample(1:14,1000000,replace=T),StomCond_Trunc=rnorm(100000)*20)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
马修更新。由于 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
Run Code Online (Sandbox Code Playgroud)