【问题标题】:Change NA to "" in a vector in R [duplicate]在R中的向量中将NA更改为“” [重复]
【发布时间】:2017-10-11 08:03:16
【问题描述】:

你好,我有一个如下的df

 a = c("AP_", "AP_", NA, "AP_", "AP_", "HP_", "AP_", "AP_") 
 b = c(20, 30, 40, 10, 20, 10, NA, 12) 
 c = c("A", "B", "C", "D", "E", "", "G", "H") 
 a_output = c("AP_", "AP_", "", "AP_", "AP_", "HP_", "AP_", "AP_") 

 df = data.frame(a, b, c,a_output)

如何通过将“a”列中的 NA 转换为 NULL 来获得“a_output”列

I have tried with grepl as below

  df$a_output = df[is.na(df$a)] <- "" 

上述声明中的任何修改 提前致谢

【问题讨论】:

  • 对于初学者来说,"" 不是NULL - 它是一个长度为 1 的空字符串。

标签: r


【解决方案1】:

我们需要使用is.na

df$a_output <- replace(as.character(df$a), is.na(df$a), "")

另外,如果我们检查'a'列的class,它是factor,所以''应该是factor列中的一个级别

levels(df$a) <- c(levels(df$a), "")
df$a[is.na(df$a)] <- ""

或者我们像第一种方法一样转换成characterreplace

【讨论】:

    【解决方案2】:

    另一种解决方案,类似于akrun的replace()答案,可以使用ifelse()实现:

    df$a_output <- ifelse(is.na(df$a), "", as.character(df$a))
    

    我不知道它在速度方面如何比较,但它确实有效:

    > df
         a  b c
    1  AP_ 20 A
    2  AP_ 30 B
    3 <NA> 40 C
    4  AP_ 10 D
    5  AP_ 20 E
    6  HP_ 10  
    7  AP_ NA G
    8  AP_ 12 H
    
    df$a_output <- ifelse(is.na(df$a), "", as.character(df$a))
    
    > df
         a  b c a_output
    1  AP_ 20 A      AP_
    2  AP_ 30 B      AP_
    3 <NA> 40 C         
    4  AP_ 10 D      AP_
    5  AP_ 20 E      AP_
    6  HP_ 10        HP_
    7  AP_ NA G      AP_
    8  AP_ 12 H      AP_
    

    您可以使用

    将其转换为 factor
    df$a_output <- as.factor(df$a_output)
    

    如果你需要的话。

    【讨论】:

      【解决方案3】:

      如果您不希望 a、c、a_output 成为因子变量,则解决方案可能如下所示:

      df = data.frame(a, b, c,a_output,stringsAsFactors = F)
      
      df$a_output[is.na(df$a)]  <- ""
      

      【讨论】:

        【解决方案4】:

        另一个解决方案:使用两个步骤,但使用我认为有助于提高可读性的 which() 函数。

        a_output<-a
        
        a_output[which(is.na(a_output))]<-""  ## which is na, assign ""
        

        【讨论】:

          猜你喜欢
          • 2012-10-30
          • 1970-01-01
          • 2016-05-10
          • 2017-11-05
          • 2023-03-22
          • 1970-01-01
          • 2018-10-08
          • 2016-08-30
          • 2019-08-27
          相关资源
          最近更新 更多