【问题标题】:changing multiple column values given a condition in dplyr在 dplyr 给定条件下更改多个列值
【发布时间】:2017-03-19 14:53:33
【问题描述】:

我正在寻找一种简单的方法来执行以下操作,但使用 dplyr,基本上只是在满足条件时将 3 列中的值替换为 NA。

dta[dta$na.ind == 1, c('x1', 'x2', 'x3')] <- NA

我能想到的使用dplyr的唯一方法是以下,但我觉得应该有更简单的方法

dta <- dta %>% 
    mutate(x1 = ifelse(na.ind == 1, NA, x1),
           x2 = ifelse(na.ind == 1, NA, x2),
           x3 = ifelse(na.ind == 1, NA, x3))

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以使用mutate_at 并将列x1,x2,x3 传递给.vars 参数:

    dta <- data.frame(na.ind = 1:3, x1 = 2:4, x2 = 2:4, x3 = 2:4, x4 = 2:4)
    dta
    #  na.ind x1 x2 x3 x4
    #1      1  2  2  2  2
    #2      2  3  3  3  3
    #3      3  4  4  4  4
    
    dta %>% mutate_at(.vars = c("x1", "x2", "x3"), funs(ifelse(na.ind == 1, NA, .)))
    #  na.ind x1 x2 x3 x4
    #1      1 NA NA NA  2
    #2      2  3  3  3  3
    #3      3  4  4  4  4
    

    【讨论】:

    • funs() 从 dplyr 0.8.0 开始被软性弃用,建议使用 ~ 代替:dta %&gt;% mutate_at(c("x1", "x2", "x3"), ~ ifelse(na.ind == 1, NA, .)))
    【解决方案2】:

    由于mutate_atmutate_all 等范围动词已被across 取代,您现在可以对 Psidom 的回答进行以下调整:

    > dta <- data.frame(na.ind = 1:3, x1 = 2:4, x2 = 2:4, x3 = 2:4, x4 = 2:4)
    > dta
      na.ind x1 x2 x3 x4
    1      1  2  2  2  2
    2      2  3  3  3  3
    3      3  4  4  4  4
    
    > dta %>% mutate(across(c(x1, x2, x3), ~ ifelse(na.ind == 1, NA, .)))
      na.ind x1 x2 x3 x4
    1      1 NA NA NA  2
    2      2  3  3  3  3
    3      3  4  4  4  4
    

    有关across 的更多信息,请参阅https://dplyr.tidyverse.org/reference/across.html

    【讨论】:

      【解决方案3】:

      如果您希望在 NA 的任何列中以 data.frame-wise 替换特定值 (-99999):

      dat %>% mutate_all(funs(ifelse(.==-99999, NA, .)))
      

      【讨论】:

      • mutate_if 对所有通过谓词的列行进行操作,而不是对行的子集进行操作。例如,您可以mutate_if(dat, is.character, as.factor)。当然,如果你坚持使用mutate_if,也是可以的:mutate_if(dat, is.numeric, funs(ifelse(.==-99999, NA, .)))
      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 2019-02-09
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多