首页 > 解决方案 > dplyr:根据分组细节更改变量

问题描述

我想根据同一组中存在哪些其他条目来更新条目。

参考玩具示例:我想将“C”(camp)更改为“B”(camp_1),以防变量 both.camp == 0 并且该组恰好缺少“C”。

玩具数据集:

data <- data.frame(ID=c(1,1,1,0,0,0),date=c(1,1,1,1,1,1),both.camps=c(0,0,0,1,1,1),camp=c("A","A","C","A","B","C"))


  ID date both.camps camp
1  1    1          0    A
2  1    1          0    A
3  1    1          0    C
4  0    1          1    A
5  0    1          1    B
6  0    1          1    C

尝试的代码:

data <- data %>% group_by(ID,date) %>% mutate(camp_2=ifelse(both.camps==0 & camp=="C" & !"B" %in% camp ,"B",
                                                              ifelse(both.camps==0 & camp=="C" & !"A" %in% camp, "A", camp)))

理想的结果

desiderata <- data.frame(ID=c(1,1,1,0,0,0),date=c(1,1,1,1,1,1),both.camps=c(0,0,0,1,1,1),camp=c("A","A","C","A","B","C"), camp_2=c("A","A","B","A","B","C"))

  ID date both.camps camp camp_2
1  1    1          0    A      A
2  1    1          0    A      A
3  1    1          0    C      B
4  0    1          1    A      A
5  0    1          1    B      B
6  0    1          1    C      C

标签: rdplyr

解决方案


这对小数据集有用,我不确定它是否仍然是最好的方法。

data <- data %>% 
         group_by(ID,date) %>% 
         mutate(camp_2=ifelse(camp=="C" & all(both.camps==0) & !any("B" %in% camp) ,"B",
                                                                  ifelse(camp=="C" & all(both.camps==0) & !any("A" %in% camp),"A", as.character(camp))))

推荐阅读