如果满足条件,则在下一行分配值

时间:2021-05-06 16:47:28

标签: 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

`

问题在于它将 columnB 中的所有其他值也转换为 NA。我希望 A 和 B 中的值不等于保持不变并且不转换为 NA。

2 个答案:

答案 0 :(得分:1)

根据描述,我们可以使用lead

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

答案 1 :(得分:0)

aa = 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", "2015/01/01", "NA")
),
row.names = c(NA,
          5L),
class = "data.frame")

bb=aa

for (i in 1:5){
 if (aa[i,2]==aa[i,3]){
bb[i,3]=bb[i+1,3] 
bb[i+1,3]="NA"
}
}
相关问题