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

时间:2020-09-01 19:50:09

标签: 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,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)
)

我想基于h和列(即f)从Season中减去Tmax。我想创建一个具有增量值的新数据框,如下所示:

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)
)

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

2 个答案:

答案 0 :(得分:1)

这是使用static let formatter = NumberFormatter() 进行联接和减去的简单方法。

dplyr
library(dplyr)

f %>% 
  left_join(h, by = "Season") %>% 
  mutate(Tmax_delta = Tmax.x - Tmax.y,
         Tmin_delta = Tmin.x - Tmin.y) %>% 
  select(CF, Season, ends_with("_delta"))

答案 1 :(得分:0)

使用的基本R选项

  • match
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
  • merge
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