我在数据框中创建了一个新变量。我想用我的数据框中不同变量的总和填充这个变量,但仅用于共享第三个值的观察。此外,当共享的第三个值逐渐增加时,我想累积计算我的新值。例如,这就是我现在所拥有的:
每个人 | PSS | MTI |
---|---|---|
1966 | 5 | 0 |
1966 | 10 | 0 |
1966 | 15 | 0 |
1967 | 4 | 0 |
1967 | 7 | 0 |
1968 | 2 | 0 |
我想要的最终产品如下所示:
每个人 | PSS | MTI |
---|---|---|
1966 | 5 | 30 |
1966 | 10 | 30 |
1966 | 15 | 30 |
1967 | 4 | 41 |
1967 | 7 | 41 |
1968 | 2 | 43 |
注意 MTI 是如何用于观察的,其中 evyy == 1967 是 PSS 的总和,其中 evyy == 1966 + PSS 的总和,其中 evyy == 1967。对于 1968 也是如此; 1968 MTI 本质上是 sum(1968 PSS, 1967 PSS, 1966 PSS) 等等。
我已经坚持了一段时间。我唯一能想到的就是一些巨大而繁琐的 ifelse()
语句字符串。除此之外,我制作了一个新的数据框,其中仅包含具有特定 evyy 的观察结果,如下所示:
1. new_df <- filter(old_df, evyy == 1966)
2. new_df$MTI <- sum(new_df$PSS)
但这并没有真正做到我想要的。我更愿意将所有内容都保留在原始数据框中。这可能吗?提前致谢!
答案 0 :(得分:1)
对于每个evyy
,计算sum
值的PSS
,然后对每个值进行累加求和并加入数据框以取回原始数据。
library(dplyr)
#No need to have an empty column beforehand.
old_df$MTI <- NULL
old_df %>%
group_by(evyy) %>%
summarise(MTI = sum(PSS)) %>%
mutate(MTI = cumsum(MTI)) %>%
left_join(old_df, by = 'evyy') -> new_df
new_df
# evyy MTI PSS
# <dbl> <int> <int>
#1 1966 30 5
#2 1966 30 10
#3 1966 30 15
#4 1967 41 4
#5 1967 41 7
#6 1968 43 2
在基础 R 中:
merge(transform(aggregate(PSS~evyy, old_df, sum),
MTI = cumsum(PSS), PSS = NULL), old_df, by = 'evyy')
数据
old_df <- structure(list(evyy = c(1966, 1966, 1966, 1967, 1967, 1968),
PSS = c(5L, 10L, 15L, 4L, 7L, 2L)), row.names = c(NA, -6L),
class = "data.frame")