2014-03-26 42 views
1

我有兩個數據向量(datA和datB)需要組合到一個數據幀中。它看起來像一個直接的東西來完成的,直到我嘗試失敗,如下圖所示:使用不等列創建數據幀

datA <- c("uuw", "aat", "auyt", "uut") 
datB <- c("mmu", "asty", "wou") 

XX <- data.frame(m=rep(NA, datA),y=rep(NA, datB)) 

我嘗試生成以下錯誤:

Error in rep(NA, datA) : invalid 'times' argument 
In addition: Warning message: 
In data.frame(m = rep(NA, datA), y = rep(NA, datB)) : 
NAs introduced by coercion 

請幫幫忙!

+0

使用'list'代替。 'data.frame'只是具有等長向量的'list'。 – alko989

+1

如果你想把這些向量放在data.frame中,你爲什麼要創建一個NA valus的data.frame? – Roland

+0

感謝您的建議列表。但我會喜歡2列,m和y,哪個列表不給我。 – user27976

回答

2

如果你想在矢量組合成一個數據幀不回收DATB的值,可以使用cbind.fill function

cbind.fill<-function(...){ 
    nm <- list(...) 
    nm<-lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function (x) 
    rbind(x, matrix(, n-nrow(x), ncol(x))))) 
} 

XX <- data.frame(cbind.fill(datA,datB)) 
colnames(XX) <- c("m","y") 
+0

快速提問:我無法擺脫cbind中的'NA',使用XX [is.na(XX)] < - 「填充輸出。有沒有更好的辦法? – user27976

+0

檢查http://stackoverflow.com/questions/8161836/how-do-i-replace-na-values-with-zeros-in-r – JT85

1

不知道爲什麼你想創建一個NAS上data.frame但這應該工作

datA <- c("uuw", "aat", "auyt", "uut") 
datB <- c("mmu", "asty", "wou") 
XX <- data.frame(m=rep(NA, max(c(length(datA), length(datB)))),y=rep(NA, max(c(length(datA), length(datB))))) 
1

無法創建不均勻的data.frame。如果你想在R中創建一個「鋸齒狀」的數據結構,列表就是要走的路。它們也可以與data.frame中的列名稱相似。

XX <- list(datA = c("uuw", "aat", "auyt", "uut"), datB = c("mmu", "asty", "wou")) 
XX 
$datA 
[1] "uuw" "aat" "auyt" "uut" 

$datB 
[1] "mmu" "asty" "wou" 

而作爲

XX$datA[1] 
"uuw" 
XX[["datA"]][2] 
"aat" 

進一步訪問在你的榜樣(羅蘭)提到您填寫您的data.frame與NA的,再加上你必須爲你傳遞數據和DATB錯誤自己代表長度(datA)和長度(datB)。

Dave的解決方案解決了引進NA的進入data.frame您的問題,溶液的選擇取決於你的使用情況。

+0

謝謝大家有用的建議和代碼。 cbind.fill對我的目的很有用。再次感謝JT85! – user27976

3

下面是一個簡單的版本,它利用length<-優勢:

cols <- list(m=datA, y=datB) 
as.data.frame(lapply(cols, `length<-`, max(sapply(cols, length)))) 

主要生產

 m y 
1 uuw mmu 
2 aat asty 
3 auyt wou 
4 uut <NA>