Dek*_*ike 3 r dplyr data.table
我有一个数据框df,可以汇总几个月中不同深度(5米T5,15米T15,25米T25和35米T35)的每小时水温。举个例子:
df<- data.frame(DateTime=c("2018-08-09 08:00:00","2018-08-09 09:00:00","2018-08-09 10:00:00","2018-08-09 11:00:00","2018-08-09 12:00:00","2018-08-09 13:00:00"),
T5=c(14.5,18.4,21.3,27.8,16.5,21.5),
T15=c(13.8,16.3,16.2,17.8,19.3,20.1),
T25=c(16.0,17.2,18.3,15.9,21.4,17.3),
T35=c(16.1,15.7,16.2,15.6,17.0,16.3))
df$DateTime<- as.POSIXct(df$DateTime, formtat="%Y-%m-%d %H:%M:%S",tz="UTC")
df
DateTime T5 T15 T25 T35
1 2018-08-09 08:00:00 14.5 13.8 16.0 16.1
2 2018-08-09 09:00:00 18.4 16.3 17.2 15.7
3 2018-08-09 10:00:00 21.3 16.2 18.3 16.2
4 2018-08-09 11:00:00 27.8 17.8 15.9 15.6
5 2018-08-09 12:00:00 16.5 19.3 21.4 17.0
6 2018-08-09 13:00:00 21.5 20.1 17.3 16.3
Run Code Online (Sandbox Code Playgroud)
我要计算的是一些与深度之间的温度差有关的变量。我想计算变量“最大水温在色谱柱中的变化”(MWTCC),该变量反映整个水柱之间CONSECUTIVE色谱柱之间的最大水温变化。稍后,我还要计算变量“ 5至15米WTC10之间的水温变化”(),“ 15至25米之间的水温变化”(WTC20)和“ 25至35米之间的水温变化”(WTC30)。我希望从上述示例中得到下一个结果:
> df
DateTime T5 T15 T25 T35 MWTCC WTC10 WTC20 WTC30
1 2018-08-09 08:00:00 14.5 13.8 16.0 16.1 2.2 0.7 2.2 0.1
2 2018-08-09 09:00:00 18.4 16.3 17.2 15.7 2.1 2.1 0.9 1.5
3 2018-08-09 10:00:00 21.3 16.2 18.3 16.2 5.1 5.1 2.1 2.1
4 2018-08-09 11:00:00 27.8 17.8 15.9 15.6 10.0 10.0 1.9 0.3
5 2018-08-09 12:00:00 16.5 19.3 21.4 17.0 4.4 2.8 2.1 4.4
6 2018-08-09 13:00:00 21.5 20.1 17.3 16.3 2.8 1.4 2.8 1.0
Run Code Online (Sandbox Code Playgroud)
有没有简单快捷的方法来计算全部?我对使用该软件包特别感兴趣data.table,尽管任何方式都可以。
提前致谢
在基数R中,我们可以使用apply逐行计算差异
df[c("MWTCC", "WTC10","WTC20", "WTC30")] <- t(apply(df[-1], 1, function(x) {
vals <- abs(diff(x))
c(max(vals), vals)
}))
df
# DateTime T5 T15 T25 T35 MWTCC WTC10 WTC20 WTC30
#1 2018-08-09 08:00:00 14.5 13.8 16.0 16.1 2.2 0.7 2.2 0.1
#2 2018-08-09 09:00:00 18.4 16.3 17.2 15.7 2.1 2.1 0.9 1.5
#3 2018-08-09 10:00:00 21.3 16.2 18.3 16.2 5.1 5.1 2.1 2.1
#4 2018-08-09 11:00:00 27.8 17.8 15.9 15.6 10.0 10.0 1.9 0.3
#5 2018-08-09 12:00:00 16.5 19.3 21.4 17.0 4.4 2.8 2.1 4.4
#6 2018-08-09 13:00:00 21.5 20.1 17.3 16.3 2.8 1.4 2.8 1.0
Run Code Online (Sandbox Code Playgroud)