首页 > 解决方案 > 如果条件满足,则在下一行中分配值,并保持其他值相同

问题描述

这是我拥有的数据

       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 中的值不等于保持不变并且不转换为 NA。

标签: rdata-wrangling

解决方案


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

推荐阅读