你可以使用rbind.fill无需它填补NA的?(Can you use rbind.fill wi

2019-10-17 19:36发布

我想两个dataframes具有不同的列数和列标题结合起来。 然而,当我使用它们合并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 ,但会愿意回答任何问题!

Answer 1:

NA是不一样的"NA" ,以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”任何NA S作为他们在第一DF,但让所有NA在第二DF从形成rbind.fill()更改为类似“不可用的”。 你可以做到这一点是这样的...

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


Answer 2:

如果你有一个包含NA的一个数据帧,并要全部更换,你可以这样做:

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

这会照顾所有NA的一杆

如果你只是想采取行动的一列,你可以这样做

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


文章来源: Can you use rbind.fill without having it fill in NA's?
标签: r na rbind