[英]Subtract two dataframes based on column value in r
我有两个数据框:
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
。 我想创建一个带有增量值的新 dataframe,如下所示:
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
加入和减去的简单方法。
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
基本 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.