你可以使用rbind.fill而不填写NA吗?

时间:2013-03-13 20:49:51

标签: r na rbind

我正在尝试将两个数据帧与不同数量的列和列标题组合在一起。但是,在我使用rbind.fill()将它们组合后,生成的文件已用NA填充空单元格。

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

我有办法:

  1. 使用rbind.fill功能,而不用NA
  2. 填充空单元格

    1. 更改列以替换NA值*
    2. *我已经浏览了博客,并尝试了两种最受欢迎​​的解决方案:

      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,但愿意回答任何问题!

2 个答案:

答案 0 :(得分:3)

NA"NA"R不同,但可能会被您最喜欢的电子表格程序解释为此类。 NA中的RNaN中的一个特殊值,就像df$col[ df$col == "NA" ] <- "NorthAmerica" (不是数字)一样。如果我理解正确,你的解决方案之一是用其他东西替换代表北美的列中的“NA”值,在这种情况下你应该能够做到......

is.na()

这假设您的“NA”值实际上是字符串。 df$col[ is.na(df$col) ] <- 0如果是字符串,则不会返回任何值,这就是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和“NA”之间差异的一个例子:

NA

解决此问题的方法

我认为您希望在第一个df中保留“NA”和任何NA s,但是将rbind.fill()形成的第二个df中的所有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 更改为某个内容喜欢“NotAvailable”。你可以这样做......

{{1}}

答案 1 :(得分:1)

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

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

这将一次性照顾所有NA

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

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