1

我正在尝试将两个具有不同列数和列标题的数据框组合起来。但是,在我使用它们组合之后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,但愿意回答任何问题!

4

2 回答 2

3

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

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

这是假设您的“NA”值实际上是字符串。is.na()如果它们是字符串,则不会返回任何值,这就是为什么df$col[ is.na(df$col) ] <- 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 中,但NA将第二个 df 中的所有内容都rbind.fill()更改为“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
于 2013-03-13T21:11:14.723 回答
1

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

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

这将一次性处理所有 NA

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

df$col[which(is.na(df$col))] <- -999
于 2013-03-13T21:13:53.593 回答