Назначьте значение в следующей строке, если условие выполнено, и оставьте другие значения одинаковыми

#r #data-wrangling

Вопрос:

Это те данные, которые у меня есть

        structure(list(id = c(1, 1, 1, 1, 1), columnA = c("2011/01/01", 
"2013/01/01", "2014/01/01", "2015/01/01", "2015/01/10"), columnB = c("NA", 
"2013/01/01", "2013/01/02", "2014/01/01", "NA")), row.names = c(NA, 
5L), class = "data.frame")
 

и это то, чего я хочу

   structure(list(id = c(1, 1, 1, 1, 1), A = c("2011/01/01", "2013/01/01", 
"2014/01/01", "2015/01/01", "2015/01/10"), B = c("NA", "2013/01/02", 
"NA", "2014/01/01", "NA")), row.names = c(NA, 5L), class = "data.frame")
 

В принципе, я хочу, чтобы значения в столбцах columnA и ColumnB были равны, затем выведите значение из строки -1 в том же столбце и вставьте NA вместо значения, идущего вверх по столбцу.
Я попробовал это

 `library(dplyr)
data %>% 
  group_by(id) %>% 
  mutate(columnB = case_when(is.na(columnB) ~ NA_character_,
                             columnA == columnB ~ lead(columnB))) %>%
  ungroup

`
 

проблема в том, что он также преобразует все остальные значения в столбце B в NA. Я хочу, чтобы значения в A и B не были равны, оставались одинаковыми и не преобразовывались в NAs.

Ответ №1:

 library(dplyr)

df %>% 
  mutate(columnB = case_when(columnA == columnB ~ lead(columnB),
                             lag(columnA) == lag(columnB) ~ NA_character_,
                             T ~ columnB))
 

Выход

   id    columnA    columnB
1  1 2011/01/01         NA
2  1 2013/01/01 2013/01/02
3  1 2014/01/01       <NA>
4  1 2015/01/01 2014/01/01
5  1 2015/01/10         NA
 

Комментарии:

1. Превосходно! это сработало идеально. Спасибо.

2. Пожалуйста. Если это ответ на ваш вопрос, пожалуйста, подумайте о том, чтобы отметить его как ответ/голосование.