2014-03-26 43 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>