【问题标题】:Can you use rbind.fill without having it fill in NA's?您可以使用 rbind.fill 而不填写 NA 吗?
【发布时间】:2013-03-13 20:49:51
【问题描述】:

我正在尝试组合具有不同列数和列标题的两个数据框。但是,在我使用rbind.fill() 组合它们之后,生成的文件已经用NA 填充了空单元格。

这很不方便,因为其中一列的数据也表示为“NA”(北美),所以当我将其导入 csv 时,电子表格无法区分它们。

我有什么办法:

  1. 使用 rbind.fill 函数而不用 NA 填充空单元格

或

  1. 更改列以替换 NA 值*

*我搜索了博客,并尝试了两种最流行的解决方案:

df$col[is.na(df$col)] <- 0, #it does not work
df$col = ifelse(is.na(df$col), "X", df$col), #it changes all the characters to numbers, and ruins the column

如果您有任何建议,请告诉我!我(很遗憾)不能分享df,但愿意回答任何问题!

【问题讨论】:

  • 字符串“它不起作用”不是 R 中的内置错误消息。
  • 请提供reproducible example。如果您无法共享您的数据框,请制作一个复制您的问题的小示例。
  • 您是否尝试过更改 write.csv 的 'na' 选项?
  • 杰克 - 抱歉,我的意思是说它对我的电子表格没有影响。我运行它时没有错误,但出现警告消息: In [&lt;-.factor(*tmp*, (is.na(df$col)), : invalid factor level, NAs generated
  • blind Jesse- 您的解决方案有效,但它替换了电子表格中的所有 NA,但我只想为一个特定列替换它。有什么想法吗?

标签: r na rbind


【解决方案1】:

NA 与 "NA" 到 R 不同,但您最喜欢的电子表格程序可能会这样解释。 NA 是 R 中的一个特殊值,就像 NaN 一样(不是数字)。如果我理解正确,您的解决方案之一是将代表北美的列中的“NA”值替换为其他值,在这种情况下,您应该能够做到...

df$col[ df$col == "NA" ] <- "NorthAmerica"

这是假设您的“NA”值实际上是字符串。如果is.na() 是字符串,则它们不会返回任何值,这就是df$col[ is.na(df$col) ] &lt;- 0 不起作用的原因。

NA和“NA”的区别举例:

x <- c( 1, 2, 3 , "NA" , 4 , 5 , NA )

> x[ !is.na(x) ]
[1] "1"  "2"  "3"  "NA" "4"  "5"

> x[ x == "NA" & !is.na(x) ]
[1] "NA"

解决方法

我认为您想将“NA”和任何NAs 保留在第一个df 中,但将rbind.fill() 形成的第二个df 中的所有NA 更改为“NotAvailable”之类的东西。你可以这样完成...

df1 <- data.frame( col = rep( "NA" , 6 ) , x = 1:6 , z = rep( 1 , 6 ) )
df2 <- data.frame( col = rep( "SA" , 2 ) , x = 1:2 , y = 5:6 )
df <- rbind.fill( df1 , df2 )
temp <- df [ (colnames(df) %in% colnames(df2)) ]
temp[ is.na( temp ) ] <- "NotAvailable"
res <- cbind( temp , df[ !( colnames(df) %in% colnames(df2) ) ] )

#df has real NA values in column z and column y. We just want to get rid of y's
df

#     col x  z  y
#   1  NA 1  1 NA
#   2  NA 2  1 NA
#   3  NA 3  1 NA
#   4  NA 4  1 NA
#   5  NA 5  1 NA
#   6  NA 6  1 NA
#   7  SA 1 NA  5
#   8  SA 2 NA  6

#res has "NA" strings in col representing "North America" and NA values in z, whilst those in y have been removed
#More generally, any NA in df1 will be left 'as-is', whilst NA from df2 formed using rbind.fill will be converted to character string "NotAvilable"
res

#     col x            y  z
#   1  NA 1 NotAvailable  1
#   2  NA 2 NotAvailable  1
#   3  NA 3 NotAvailable  1
#   4  NA 4 NotAvailable  1
#   5  NA 5 NotAvailable  1
#   6  NA 6 NotAvailable  1
#   7  SA 1            5 NA
#   8  SA 2            6 NA

【讨论】:

  • 实际上,北美的“NA”值是固定的。我想将“null” NA 值更改为其他值,例如“-”
  • @David 下面的解决方案对您有用吗?还需要调整吗?
  • 感谢西蒙的帮助。我实际上无法让 x[is.na(x)]
  • 嗨@David 我将编辑我的答案,以便您可以更清楚地看到这些步骤。我认为我们可能在 rbind.fill 阶段存在误解。
  • @David 已编辑 - 如果这是您所期望的,请告诉我。
【解决方案2】:

如果您有一个包含 NA 的数据框并且您想替换它们,您可以执行以下操作:

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

这将一次性解决所有 NA 问题

如果您只想对单个列进行操作,您可以执行类似的操作

df$col[which(is.na(df$col))] <- -999

【讨论】:

  • 我在最初的问题中尝试过,但不幸的是,它对我的​​电子表格没有影响。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2014-03-22
相关资源
最近更新 更多