R dplyr добавить значения на основе предыдущего значения и значения из другого столбца - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть фрейм данных

> 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'))

Я написал для l oop

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

, но он не работал

Редактировать: Фактические значения: цифры c. Я использую письма для вас, чтобы прочитать это быстро. (И, возможно, я не должен!)

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Вот ответ, используя for l oop:

# 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])
}

Если вы хотите, чтобы это работало с данными цифр c, используйте

for (i in 2:nrow(df)){
  df$A[i] <- df$A[i-1] + df$B[i]
}
2 голосов
/ 27 февраля 2020

Мы можем использовать Reduce с accumulate = 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 голос
/ 27 февраля 2020

Вы можете использовать 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])))

, дающих тот же результат .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...