【问题标题】:replace 0 with NA without changing the class [closed]在不更改类的情况下用 NA 替换 0 [关闭]
【发布时间】:2020-11-05 20:36:41
【问题描述】:

有没有办法在我们有asd$b == "b" 的地方用 NA 替换 0 而无需更改 asd 的类

> asd <- data.frame(a = c(1,0,0), b = c("a","b","c"))
> asd
  a b
1 1 a
2 0 b
3 0 c

我在下面尝试过,但失败了

asd$a <- ifelse(asd$a[asd$b == "b"] == 0, "NA", asd$a[asd$b == "b"])

预期输出

> asd
  a   b
1 1   a
2 NA  b
3 0   c

仍然期望输出的类应该是数字

【问题讨论】:

  • 去掉 NA 周围的引号。

标签: r vector na


【解决方案1】:

base解决方案

asd$a[asd$a == 0 & asd$b == "b"] <- NA

#    a b
# 1  1 a
# 2 NA b
# 3  0 c

dplyr解决方案

asd %>% mutate(a = if_else(b == "b", na_if(a, 0), a))

asd %>% mutate(a = if_else(a == 0 & b == "b", NA_real_, a))

【讨论】:

    【解决方案2】:

    如果您想使用ifelse 语句,请尝试此解决方案

    asd$a <- ifelse(asd$a == 0 & asd$b == "b", NA, asd$a)
    

    问题是您插入了带引号的"NA",它只是一个简单的字符串,因此变量a 被强制转换为字符。您应该改用未加引号的NA,它表示缺失值。


    例子

    asd <- data.frame(a = c(1,0,0), b = c("a","b","c"))
    str(asd)
    # 'data.frame': 3 obs. of  2 variables:
    #  $ a: num  1 0 0
    #  $ b: chr  "a" "b" "c"
    
    asd$a <- ifelse(asd$a == 0 & asd$b == "b", NA, asd$a)
    str(asd)
    # 'data.frame': 3 obs. of  2 variables:
    #  $ a: num  1 NA 0
    #  $ b: chr  "a" "b" "c"
    

    【讨论】:

      【解决方案3】:

      你可以使用dplyr:

      asd %>%
        mutate(a = ifelse(b == "b", na_if(a,0), a))
      

      给你

         a b
      1  1 a
      2 NA b
      3  0 c
      

      【讨论】:

        【解决方案4】:

        引用的"NA"NA 不同。

        "NA" 是一个字符,如果您指定该值,R 将强制该列使用该字符,而 NA 是一个缺失值指示符。

        之前所有的答案都是正确的,我只是尝试给出强制的原因。

        【讨论】:

          猜你喜欢
          • 2013-07-24
          • 1970-01-01
          • 1970-01-01
          • 2021-11-08
          • 2011-07-17
          • 2020-02-22
          • 2014-02-08
          • 1970-01-01
          • 2013-11-16
          相关资源
          最近更新 更多