根据另一列对列中的值进行过滤和替换

时间:2019-12-12 10:28:17

标签: r dplyr

下面是我拥有的数据集的样本

call

enter image description here

对于structure(list(x = c("P", "P", "P", "P"), y = c("0", "0", "1", "0"), z = c("0", "0", "0", "CD")), row.names = c(NA, -4L), class = "data.frame") 中存在的P群组,我需要检查x是否包含z,如果确实包含CD 1中的值。如果是,则将y替换为CD

所需的输出

enter image description here

XCD永远不会出现在同一行中,并且必须按1分组

感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以尝试使用简单的ifelse语句来检查y的总和是否大于0(即存在1)和z是否为'CD',

library(dplyr)

df %>% 
 group_by(x) %>% 
 mutate(z = ifelse(any(y == '1') & z == 'CD', 'x', z))

# A tibble: 4 x 3
# Groups:   x [1]
#  x         y z    
#  <chr> <dbl> <chr>
#1 P         0 0    
#2 P         0 0    
#3 P         1 0    
#4 P         0 x    

答案 1 :(得分:2)

这是base R的解决方案,其中ifelse()用于替换

df <- Reduce(rbind,lapply(split(df,df$x),
                          function(v) within(v,z <- ifelse(any(y==1) & z=="CD","X",z))))

如此

> df
  x y z
1 P 0 0
2 P 0 0
3 P 1 0
4 P 0 X