【问题标题】:Filter and Replace value in a column based on another column根据另一列过滤和替换列中的值
【发布时间】:2020-04-05 17:19:54
【问题描述】:

以下是我拥有的数据集示例

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

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

期望的输出

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

感谢任何帮助。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

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

    【讨论】:

    • 忘了提到我的错误y 列是字符,它具有其他字符值,但我只需要 1 个(值)过滤器,因此转换为numeric 是否安全,或者我应该使用any ?
    • 如果它只有 0 和 1,只需将其转换为数字。无需保留一个字符
    • 除了0和1之外还有其他字符值
    • 是的,然后就做any
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多