基于另一列的列中的过滤和替换值

问题描述 投票:0回答:2

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

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")

enter image description here

对于P中存在的x群组,我需要检查z是否包含CD,如果确实包含,则检查1中的y值。如果是,则将CD替换为X

所需的输出

enter image description here

[CD1永远不会出现在同一行中,并且必须按x进行分组

感谢您的帮助。谢谢!

r dplyr
2个回答
2
投票

您可以尝试一个简单的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    

0
投票

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

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

诸如此类

> df
  x y z
1 P 0 0
2 P 0 0
3 P 1 0
4 P 0 X
© www.soinside.com 2019 - 2024. All rights reserved.