根据r中的列值减去两个数据帧

根据r中的列值减去两个数据帧,r,dplyr,R,Dplyr,我有两个数据帧: f <- data.frame( CF = c(1,2,3,4,1,2,3,4), Season = c("Fall", "Spring", "Summer", "Winter","Fall", "Spring", "Summer", "Winter"), Tmax = c(51,65,83,38,

我有两个数据帧:

f <- data.frame(
  CF = c(1,2,3,4,1,2,3,4), 
  Season = c("Fall", "Spring", "Summer", "Winter","Fall", "Spring", "Summer", "Winter"), 
  Tmax = c(51,65,83,38,52,68,90,45), 
  Tmin = c(30,40,53,19, 32,43,60,23))
h <- data.frame(
  Season = c("Fall", "Spring", "Summer", "Winter"), 
  Tmax = c(47,60,79,35), 
  Tmin = c(27,36,52,16)
)

我该怎么做?Dplyr解决方案始终受到赞赏。谢谢

这里有一个使用
dplyr
进行加法和减法的简单方法

库(dplyr)
f%>%
左联合(h,by=“seasure”)%>%
突变(Tmax_delta=Tmax.x-Tmax.y,
Tmin_delta=Tmin.x-Tmin.y)%>%
选择(CF,季节,以(“\u delta”)结束)
CF季节Tmax\u delta Tmin\u delta
1跌倒4 3
2弹簧5 4
3夏季4 1
4冬季3 3
5.1跌倒5.5
6 2弹簧8 7
7 3夏季11 8
8 4冬季10 7
使用

  • 匹配
  • 合并

看起来您实际上不需要这里的
dplyr
。您是否检查了
merge
功能?到目前为止,您尝试过哪些功能不起作用?这有助于
merge(f,h,by=c('seasure'),all.x=t)
delta <- data.frame(
  CF = c(1,2,3,4,1,2,3,4), 
  Season = c("Fall", "Spring", "Summer", "Winter","Fall", "Spring", "Summer", "Winter"), 
  Tmax_delta = c(4,5,4,3,5,8,11,10), 
  Tmin_delta = c(3,4,1,3,5,7,8,7)
)
nms <- c("Tmax","Tmin")
delta <- cbind(f[1:2],setNames(f[nms]-h[match(f$Season,h$Season),][nms],paste0(nms,"_delta")))
> delta
  CF Season Tmax_delta Tmin_delta
1  1   Fall          4          3
2  2 Spring          5          4
3  3 Summer          4          1
4  4 Winter          3          3
5  1   Fall          5          5
6  2 Spring          8          7
7  3 Summer         11          8
8  4 Winter         10          7
u <- merge(f, h, by = "Season", all = TRUE)
d <- u[grep("\\.x", names(u))] - u[grep("\\.y", names(u))]
delta <- cbind(u[c("CF", "Season")], setNames(d, gsub("\\..*", "_delta", names(d))))
> delta
  CF Season Tmax_delta Tmin_delta
1  1   Fall          4          3
2  1   Fall          5          5
3  2 Spring          5          4
4  2 Spring          8          7
5  3 Summer          4          1
6  3 Summer         11          8
7  4 Winter          3          3
8  4 Winter         10          7