【问题标题】:Subtract two dataframes based on column value in r根据 r 中的列值减去两个数据帧
【发布时间】:2020-09-02 04:46:49
【问题描述】:

我有两个数据框:

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

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

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 解决方案总是受到赞赏。谢谢!

【问题讨论】:

  • 看来您在这里并不需要dplyr。你检查merge函数了吗?
  • 到目前为止,您尝试过哪些无效的方法?
  • 这可以帮助merge(f,h,by=c('Season'),all.x=T)

标签: r dplyr


【解决方案1】:

这是使用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"))
  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

【讨论】:

    【解决方案2】:

    使用基本 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
    

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多