我想两个dataframes具有不同的列数和列标题结合起来。 然而,当我使用它们合并rbind.fill()
生成的文件,填补了空白单元格与NA
。
这是非常不方便的,因为一个列有也表示为“NA”(北美)的数据,所以当我将其导入到CSV,电子表格不能告诉他们分开。
是否有我的方式:
- 使用
rbind.fill
功能,而无需它填充空细胞与NA
要么
- 更改列替换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
,但会愿意回答任何问题!
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
如果你有一个包含NA的一个数据帧,并要全部更换,你可以这样做:
df[is.na(df)] <- -999
这会照顾所有NA的一杆
如果你只是想采取行动的一列,你可以这样做
df$col[which(is.na(df$col))] <- -999