R dplyr根据先前的值和另一列中的值添加值

时间:2020-02-27 04:00:10

标签: r dplyr

我有一个数据框

> df
  A B
1 a x
2 b y
3 c z
4 d n
5 e m

我希望将A列中的先前值与B列中的当前值相加,以替换当前A列,以便所需的输出变为

> df
          A B
1         a x
2       a+y y
3     a+y+z z
4   a+y+z+n n
5 a+y+z+n+m m

创建数据框的代码

df = data.frame(A = c('a','b','c', 'd', 'e'), B = c('x', 'y', 'z', 'n', 'm'))

我写了循环

for(i in df){
  df$A = lag(df$A) + df$B
}

但没有用

编辑: 实际值为数字。我用信件让您快速阅读。 (也许我不应该!)

3 个答案:

答案 0 :(得分:2)

我们可以将Reduceaccumulate = TRUE一起使用

Reduce(function(x, y) paste(x, y, sep = "+"), df$B[-1], accumulate = TRUE, 
       init = df$A[1])
#[1] "a"         "a+y"       "a+y+z"     "a+y+z+n"   "a+y+z+n+m"

类似地,我们也可以使用accumulate中的purrr

library(dplyr)
library(purrr)

df %>% mutate(A = accumulate(B[-1], paste, sep = "+", .init = first(A)))

#          A B
#1         a x
#2       a+y y
#3     a+y+z z
#4   a+y+z+n n
#5 a+y+z+n+m m

数据

df <- data.frame(A = c('a','b','c', 'd', 'e'), B = c('x', 'y', 'z', 'n', 'm'), 
     stringsAsFactors = FALSE)

答案 1 :(得分:1)

您可以使用cumsum。这是使用一些numeric数据的最小示例

df <- data.frame(A = 1:5, B = 6:10)

以R为底

transform(df, A = A[1] + cumsum(c(0, B[-1])))
#   A  B
#1  1  6
#2  8  7
#3 16  8
#4 25  9
#5 35 10

或使用dplyr

library(dplyr)
df %>% mutate(A = A[1] + cumsum(c(0, B[-1])))

给出相同的结果。

答案 2 :(得分:1)

使用for循环在此处回答:

# need to make sure they are not factors
df = data.frame(A = c('a','b','c', 'd', 'e'), 
                B = c('x', 'y', 'z', 'n', 'm'),
                stringsAsFactors = F)

# start at 2, not 1, then get the previous row within the loop itself
for (i in 2:nrow(df)){
  df$A[i] <- paste0(df$A[i-1], '+', df$B[i])
}

如果要使用数字数据,请使用

for (i in 2:nrow(df)){
  df$A[i] <- df$A[i-1] + df$B[i]
}