我有两个数据框:
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解决方案始终受到赞赏。谢谢!
答案 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