【问题标题】:Replace missing values (NA) with blank (empty string)将缺失值 (NA) 替换为空白(空字符串)
【发布时间】:2013-11-04 17:46:48
【问题描述】:

我有一个带有 NA 行的数据框:

 df = data.frame(c("classA", NA, "classB"), t(data.frame(rep("A", 5), rep(NA, 5), rep("B", 5))))
 rownames(df) <- c(1,2,3)
 colnames(df) <- c("class", paste("Year", 1:5, sep = ""))

 > df
   class Year1 Year2 Year3 Year4 Year5
1 classA     A     A     A     A     A
2   <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
3 classB     B     B     B     B     B

我特意引入了空行(NA 行),因为我想在 classA 行和 classB 行之间留一些空间。

现在,我想将&lt;NA&gt; 替换为空白,这样第二行看起来就像一个空行。

我试过了:

 df[is.na(df)] <- ""

 df[df == "NA"] <- ""

但它没有工作..

有什么想法吗?谢谢!

【问题讨论】:

  • 您的第一次尝试对我来说效果很好。没用怎么办?
  • 我仍然在数据框中看到 ,代码似乎没有任何影响
  • 这与因素有关(当然!)...试试str(df)(我的回答一头雾水!)
  • 顺便说一句,永远不要只说“它不起作用”。您忽略了提及您在运行该代码时肯定收到的六个(!)警告消息。警告信息应该非常具有暗示性,你不觉得吗?
  • &lt;NA&gt; 周围的括号表示它们不是字符串。 Have a look HERE 了解更多信息。

标签: r na


【解决方案1】:

另一种选择:

df <- sapply(df, as.character) # since your values are `factor`
df[is.na(df)] <- 0

如果你想要空白而不是零

> df <- sapply(df, as.character)
> df[is.na(df)] <- " "
> df
     class    Year1 Year2 Year3 Year4 Year5
[1,] "classA" "A"   "A"   "A"   "A"   "A"  
[2,] " "      " "   " "   " "   " "   " "  
[3,] "classB" "B"   "B"   "B"   "B"   "B"  

如果你想要一个data.frame,那么就用as.data.drame

> as.data.frame(df)
   class Year1 Year2 Year3 Year4 Year5
1 classA     A     A     A     A     A
2                                     
3 classB     B     B     B     B     B

【讨论】:

  • 我认为“”是空格,“”是空白。我说的对吗?
  • 如果您用空格 ("") 替换 NA,请小心。转换回 data.frame 将再次引入 NA。我发现最安全的方法是直接替换 NA,而不需要将数据框转换为字符矩阵。
【解决方案2】:

这个答案更像是一个扩展评论。

你试图做的不是我认为好的做法。 R 不是,比如说,Excel,所以做这样的事情只是为了在你的数据中创建视觉分离只会让你以后头疼。

如果你真的只关心视觉输出,我可以提供两个建议:

  1. 当您想要查看具有这种视觉分隔的数据时,请使用 printna.print 参数。

    print(df, na.print = "")
    #    class Year1 Year2 Year3 Year4 Year5
    # 1 classA     A     A     A     A     A
    # 2                                     
    # 3 classB     B     B     B     B     B
    
  2. 意识到即使是上面的也不是最好的建议。通过将您的 data.frame 转换为 list 来获得 visualcontent 分离:

    split(df, df$class)
    # $classA
    #    class Year1 Year2 Year3 Year4 Year5
    # 1 classA     A     A     A     A     A
    # 
    # $classB
    #    class Year1 Year2 Year3 Year4 Year5
    # 3 classB     B     B     B     B     B
    

【讨论】:

  • 为了使na.print工作,数据框列现在必须是字符。如果不是,则将数据框转换为dplyr::mutate(across(everything(), as.character))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2020-03-29
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多