我正在尝试将两个数据帧与不同数量的列和列标题组合在一起。但是,在我使用rbind.fill()
将它们组合后,生成的文件已用NA
填充空单元格。
这非常不方便,因为其中一列的数据也表示为“NA”(对于北美),因此当我将其导入csv时,电子表格无法区分它们。
我有办法:
rbind.fill
功能,而不用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
,但愿意回答任何问题!
答案 0 :(得分:3)
NA
与"NA"
与R
不同,但可能会被您最喜欢的电子表格程序解释为此类。 NA
中的R
是NaN
中的一个特殊值,就像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
我认为您希望在第一个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