我有两个数据向量(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 :(得分: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来解决您的问题,解决方案的选择取决于您的使用情况。