【问题标题】:Assign the value in the next row if condition met and leave other values the same如果条件满足,则在下一行中分配值,并保持其他值相同
【发布时间】:2021-05-06 19:00:13
【问题描述】:

这是我拥有的数据

       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。

【问题讨论】:

    标签: r data-wrangling


    【解决方案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
    

    【讨论】:

    • 太棒了!它工作得很好。谢谢。
    • 不客气。如果这回答了您的问题,请考虑将其标记为已回答/赞成。
    猜你喜欢
    • 2020-08-18
    • 2019-06-05
    • 1970-01-01
    • 2019-05-15
    • 2018-12-13
    • 2016-02-05
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多