简体   繁体   中英

Subtract two dataframes based on column value in r

I have two dataframes:

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

I would like to subtract h from f based on Season and column (ie, Tmax ). I would like to create a new dataframe with delta values, like this:

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

How can I do this? Dplyr solutions always appreciated. Thanks!

Here is an easy way to join and subtract using 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

A base R option using

  • match
nms <- c("Tmax","Tmin")
delta <- cbind(f[1:2],setNames(f[nms]-h[match(f$Season,h$Season),][nms],paste0(nms,"_delta")))

giving

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

giving

> 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM