根据另一列中的值减去一列中的数据

时间:2017-01-20 19:57:16

标签: r

我想根据传感器列中的值减去Temp列中的值。按每个日期和位置分组,我想从传感器值为2的Temp中传感器值为1减去Temp。请参阅下面的数据示例。

date <- c("2016-03-21","2016-03-21","2016-03-21","2016-03-21","2016-03-21","2016-03-21")
location <- c(1,1,2,2,3,3)
sensor <- c(1,16,1,16,1,16)
Temp <- c(35,34,45,42,46,47)
df <- data.frame(date,location,sensor,Temp)

这是我尝试使用dplyr ...

尝试这样做的尝试
test <- df %>% group_by(date,location,sensor) %>% lfMaxTemp$Temp["sensor"==1]-lfMaxTemp$Temp["sensor"==16]

这是我想要的结果:

        date location diff
1 2016-03-21        1    1
2 2016-03-21        2    3
3 2016-03-21        3   -1

2 个答案:

答案 0 :(得分:1)

library(dplyr)
df %>% group_by(date, location) %>% summarise(diff = Temp[sensor==1]- Temp[sensor==16])
#        date location  diff
#1 2016-03-21        1     1
#2 2016-03-21        2     3
#3 2016-03-21        3    -1

答案 1 :(得分:1)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'日期','位置',order将基于'sensor'的行按降序分组,我们总结了通过使用diff

获取第1和第2次观测值之间的差值来输出
library(data.table)
setDT(df)[order(-sensor), .(Diff  = diff(Temp)), .(date, location)]
#         date location Diff
#1: 2016-03-21        1    1
#2: 2016-03-21        2    3
#3: 2016-03-21        3   -1

注意:这里我们假设每个'Temp'

在'Temp'中只有1和16个值

如果'Temp'中还有其他值,只需在分组之前进行过滤

 setDT(df)[Temp %in% c(1, 16)][order(-sensor), .(Diff  = diff(Temp)), .(date, location)]

数据

df <- data.frame(date,location,sensor,Temp)

评论

建议不要使用as.data.frame(cbind(..来构建data.frame,因为它可能导致所有列都位于class factor/character中。