【问题标题】:Mutate ifelse to replace values in r改变 ifelse 以替换 r 中的值
【发布时间】:2020-07-20 21:11:44
【问题描述】:

我有一个如下所示的数据框:

Word     Value1   Value2

Apple    True     True
Chair    True     False
nonWord  False    False
Hat      False    True
...      ...

我正在尝试将 nonWords 的所有值更改为 NA's。

data %>%
  mutate(Value1 = ifelse(Word == "nonWord", NA, Value1)) %>%
  mutate(Value2 = ifelse(Word == "nonWord", NA, Value2))

但是,这似乎不起作用,因为我的值没有被NA 取代。有谁知道我做错了什么?

期望的输出:

Word     Value1   Value2

Apple    True     True
Chair    True     False
nonWord  NA       NA
Hat      False    True
...      ...

【问题讨论】:

    标签: r data-wrangling


    【解决方案1】:

    对于这些情况,最好使用base R 中的replace() 而不是ifelse()

    library(dplyr)
    
    df %>%
      mutate(Value1 = replace(Value1, Word == "nonWord", NA),
             Value2 = replace(Value2, Word == "nonWord", NA))
    
    #>      Word Value1 Value2
    #> 1   Apple   True   True
    #> 2   Chair   True  False
    #> 3 nonWord   <NA>   <NA>
    #> 4     Hat  False   True
    

    如果您确定要替换的所有列都命名为“Value...”,则可以利用 mutate_at() from dplyr

    library(dplyr)
    
    df %>%
      mutate_at(vars(starts_with("Value")), ~ replace(., Word == "nonWord", NA))
    
    #>      Word Value1 Value2
    #> 1   Apple   True   True
    #> 2   Chair   True  False
    #> 3 nonWord   <NA>   <NA>
    #> 4     Hat  False   True
    

    数据

    df <- structure(list(Word = c("Apple", "Chair", "nonWord", "Hat"), 
        Value1 = c("True", "True", "False", "False"), Value2 = c("True", 
        "False", "False", "True")), class = "data.frame",
        row.names = c(NA, -4L))
    

    【讨论】:

      【解决方案2】:

      i (df1$Word == 'nonWord') 中的行创建逻辑向量,在j 中指定列索引(-1 - 意味着不选择第一列)并将值分配给NA

      df1[df1$Word == 'nonWord', -1] <- NA
      df1
      #     Word Value1 Value2
      #1   Apple   True   True
      #2   Chair   True  False
      #3 nonWord   <NA>   <NA>
      #4     Hat  False   True
      

      或使用dplyr

      library(dplyr) # 1.0.0
      df1 <- df1 %>% 
             mutate(across(starts_with("Value"), ~ case_when(Word != 'nonWord' ~ .)))
      

      在 OP 的帖子中,正在发生替换,但输出未分配 (&lt;-) 回原始对象。默认情况下,mutate 不会修改 in place。如果我们要进行就地修改,请使用magrittr 中的%&lt;&gt;% 而不是%&gt;%

      数据

      df1 <- structure(list(Word = c("Apple", "Chair", "nonWord", "Hat"), 
          Value1 = c("True", "True", "False", "False"), Value2 = c("True", 
          "False", "False", "True")), class = "data.frame", row.names = c(NA, 
      -4L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-29
        • 2019-01-22
        • 1970-01-01
        相关资源
        最近更新 更多