我在R中有一个向量列表:
[[1]]
[1] 1 2 3 4
[[2]]
[1] 7 9 1 4
[[3]]
[1] 8 2 1
[[4]]
[1] 8 9 0 7
我想从中提出dataframe
。问题是,我不能简单地使用unlist然后重新组织,因为并非所有向量都是相同的长度 - 当发生这种情况时我想在我的数据帧中使用NA。最终结果应如下所示:
Col1 Col2 Col3 Col4
1 2 3 4
7 9 1 4
8 2 1 NA
8 9 0 7
有办法做到这一点吗?
答案 0 :(得分:2)
使用purrr
,您可以执行以下操作:
require(purrr)
L <- list(1:4, c(7,9,1,4), c(8,2,1), c(8,9,0,7))
map_df(L, ~as.data.frame(t(.)))
这给了你:
V1 V2 V3 V4
1 1 2 3 4
2 7 9 1 4
3 8 2 1 NA
4 8 9 0 7
基地R方法:
clen <- vapply(L, length, integer(1))
mat <- matrix(NA, nrow = length(L), ncol = max(clen))
for(i in seq_along(L)){
mat[i, seq(1, clen[i])] <- L[[i]]
}
as.data.frame(mat)
答案 1 :(得分:1)
在基数R中尝试此操作(其中ls
是您的列表对象):
data.frame(t(sapply(ls, function(x) x[1:max(lengths(ls))])))
根据您的数据给出的信息:
# X1 X2 X3 X4
#1 1 2 3 4
#2 7 9 1 4
#3 8 2 1 NA
#4 8 9 0 7
一般来说,c(1:5)[1:7]
会给你
#[1] 1 2 3 4 5 NA NA
答案 2 :(得分:1)
cbind.ts可以处理不同长度的对象。使用它我们可以获得以下一个行基础解决方案:
as.data.frame(t(unname(do.call("cbind", lapply(L, ts)))))
,并提供:
V1 V2 V3 V4
1 1 2 3 4
2 7 9 1 4
3 8 2 1 NA
4 8 9 0 7
这可以替代地表示为magrittr管道:
library(magrittr)
L %>%
lapply(ts) %>%
do.call(what = "cbind") %>%
t %>%
unname %>%
as.data.frame
注意:我们将此作为输入:
L <- list(1:4, c(7, 9, 1, 4), c(8, 2, 1), c(8, 9, 0, 7))
答案 3 :(得分:0)
我们可以使用stri_list2matrix
中的stringi
并从mode
转换为character
到integer
library(stringi)
m1 <- stri_list2matrix(L, byrow=TRUE)
mode(m1) <- "integer"
m1
# [,1] [,2] [,3] [,4]
#[1,] 1 2 3 4
#[2,] 7 9 1 4
#[3,] 8 2 1 NA
#[4,] 8 9 0 7
matrix
可以data.frame
转换为as.data.frame
as.data.frame(m1)
L <- list(1:4, c(7, 9, 1, 4), c(8, 2, 1), c(8, 9, 0, 7))