使用不相等的列创建数据框

时间:2014-03-26 12:03:52

标签: r

我有两个数据向量(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

请帮忙!

4 个答案:

答案 0 :(得分:4)

这是一个利用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>

答案 1 :(得分: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")

答案 2 :(得分:1)

不确定您为什么要尝试使用NA创建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)))))

答案 3 :(得分: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"

在你的例子中(正如Roland所说)你用NA填充你的data.frame,加上你有一个bug,因为你将datA和datB本身传递给rep而不是length(datA)和length(datB)。

Dave的解决方案通过在数据框中引入NA来解决您的问题,解决方案的选择取决于您的使用情况。