【发布时间】:2019-09-14 15:56:05
【问题描述】:
关于组合不同长度的向量有一个类似的问题here,但所有答案(@Ronak Shah 的答案除外)都会丢失名称/列名。
我的问题是我需要保留列名,这似乎可以使用rowr 包和cbind.fills。
我想留在 base-R 或使用 stringi 并且输出应保持为矩阵。
测试数据:
inp <- list(structure(c("1", "2"), .Dim = 2:1, .Dimnames = list(NULL,"D1")),
structure(c("3", "4", "5"), .Dim = c(3L, 1L), .Dimnames = list(NULL, "D2")))
我知道我可以事先获取列名,然后在创建矩阵后重新分配它们,例如:
## Using stringi
colnam <- unlist(lapply(inp, colnames))
out <- stri_list2matrix(inp)
colnames(out) <- colnam
out
## Using base-R
colnam <- unlist(lapply(inp, colnames))
max_length <- max(lengths(inp))
nm_filled <- lapply(inp, function(x) {
ans <- rep(NA, length = max_length)
ans[1:length(x)]<- x
ans
})
out <- do.call(cbind, nm_filled)
colnames(out) <- colnam
out
还有其他选项可以保留列名吗?
【问题讨论】:
-
在那个问题中它是向量列表,但在这里你有矩阵列表。这是故意的吗?
-
是的,我知道,但它仍然适用于矩阵。是的,它也可以有多个列,而不仅仅是 2 个。
-
如何处理不同的列?例如,更改
inp[[1]] <- cbind(inp[[1]], "D3" = 4)后,inp的预期输出是什么? -
应该填写NA。所以这应该导致
cbind(inp[[1]], "D3" = c(4,NA))