Обновите значения в следующей строке, если условие выполнено - PullRequest
0 голосов
/ 10 января 2019

У меня есть ситуация, когда я хочу, чтобы значение следующей строки было выбрано для обновления столбца, а не строки, в которой выполняется условие. Так что обычный ifelse не работает для меня.

Например, если значение столбца C больше 80, то я хочу, чтобы значение столбца D обновлялось значением столбца A, но в следующей строке. Набор фиктивных данных

A   B  C   D

10 11  12  0
1  13  14  0
3   4  85  0
78  56 56  0
70  80 16  0
60  67 86  0
50  65 77  0

Ожидаемый набор данных

A   B  C   D

10 11  12  0
1  13  14  0
3   4  85  0
78  56 56  78
70  80 16  0
60  67 86  0
50  65 77  50

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Мы можем использовать ifelse

library(tidyverse)
df1 %>% 
    mutate(D = lag(ifelse(C > 80, lead(A), D), default = first(D)))
#   A  B  C  D
#1 10 11 12  0
#2  1 13 14  0
#3  3  4 85  0
#4 78 56 56 78
#5 70 80 16  0
#6 60 67 86  0
#7 50 65 77 50

Или умножить на логический индекс

df1 %>% 
   mutate(D = lag((C > 80) * lead(A, default = last(A)), default = first(D)))

Это также можно сделать в base R

df1$D <-  with(df1, c(D[1], head((C > 80) * c(A[-1], A[length(A)]), -1)))

Данные

df1 <- structure(list(A = c(10L, 1L, 3L, 78L, 70L, 60L, 50L), B = c(11L, 
13L, 4L, 56L, 80L, 67L, 65L), C = c(12L, 14L, 85L, 56L, 16L, 
86L, 77L), D = c(0L, 0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", 
 row.names = c(NA, -7L))
0 голосов
/ 10 января 2019

Мы могли бы получить индексы, где C больше 80, увеличить его на 1. Получить соответствующие значения A и обновить его в D.

inds <- which(df$C > 80) + 1
df$D[inds] <- df$A[inds]


df
#   A  B  C  D
#1 10 11 12  0
#2  1 13 14  0
#3  3  4 85  0
#4 78 56 56 78
#5 70 80 16  0
#6 60 67 86  0
#7 50 65 77 50

Как упомянуто @G. Гротендик, это вернет ошибку, если последнее значение в C больше 80. В таких случаях мы обновляем только те inds, которые меньше или равны количеству строк в кадре данных.

df$D[inds[inds <= nrow(df)]] <- df$A[inds[inds <= nrow(df)]]
...