如何根据 r 中的其他值更改数据帧中的值?

时间:2021-02-12 04:47:27

标签: r

我在数据框中创建了一个新变量。我想用我的数据框中不同变量的总和填充这个变量,但仅用于共享第三个值的观察。此外,当共享的第三个值逐渐增加时,我想累积计算我的新值。例如,这就是我现在所拥有的:

<头>
每个人 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)

但这并没有真正做到我想要的。我更愿意将所有内容都保留在原始数据框中。这可能吗?提前致谢!

1 个答案:

答案 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")
相关问题