2017-04-03 52 views
0

ds2已包含NA。我想區分填充產生的「已存在」NA和NA。在rbind.fill中指定「填充值」

library(plyr) 
l <- LETTERS[] 
ds1 <- data.frame(a=l[1:3],b=l[5:7],c=l[7:9],d=l[10:12],stringsAsFactors = F) 
ds2 <- data.frame(a=NA,b=l[23], c=l[22],stringsAsFactors = F) 

rbind.fill(ds1,ds2) 

給出:

 a b c d 
1 A E G J 
2 B F H K 
3 C G I L 
4 <NA> W V <NA> 

我想的是:

 a b c d 
1 A E G J 
2 B F H K 
3 C G I L 
4 <NA> W V foobar 

我需要一個通用的解決方案來設置特定的 「填充值」 rbinding dataframes時。

我知道我可以區分像到NAS:

ds2[is.na(ds2)] <- "alreadyFooBar" 
rbind.fill(ds1,ds2) 

       a b c d 
1    A E G J 
2    B F H K 
3    C G I L 
4 alreadyFooBar W V <NA> 

有沒有一種可能的其他方式?

+0

請不要downvote沒有反饋!那我該如何改進呢? –

回答

1

我認爲這應該得到你在找什麼:

library(plyr) 
library(dplyr) 
l <- LETTERS[] 
ds1 <- data.frame(a=l[1:3],b=l[5:7],c=l[7:9],d=l[10:12],],stringsAsFactors = F) 
ds2 <- data.frame(a=NA,b=l[23], c=l[22],stringsAsFactors = F) 

NewCols <- setdiff(colnames(ds1),colnames(ds2)) 
ds2[NewCols] <- "fooBar" 
rbind.fill(ds1,ds2) 

給出:

 a b c  d 
1 A E G  J 
2 B F H  K 
3 C G I  L 
4 <NA> W V fooBar 
+0

非常好。這種方式是有效的,即使我在這裏建議的基礎綁定。 –

0

謝謝。我創造了我將來可以依賴的功能。即使兩個輸入都可能有丟失列

fast.rbind <- function(x,y,value=NA){ 
    x[setdiff(colnames(y),colnames(x))] <- value 

    y[setdiff(colnames(x),colnames(y))] <- value 

    return(rbind(x,y)) 
} 

x <- data.frame(a=l[1:3],b=l[5:7],c=l[7:9],d=l[10:12],stringsAsFactors = F) 
y <- data.frame(a=NA, z=l[22],stringsAsFactors = F) 
fast.rbind(x,y,"foobar")