列表中包含不同长度的不同子列表
l
[[1]] 3,4,5,7,8
[[2]] 4,5,7
[[3]] 3,9
[[4]] 6,7,8,10
如何将列表重新排序为cols为子列表1到4的数据框?其余的应该填充NA。那我可以在这个数据框架上使用融化吗?
答案 0 :(得分:3)
使用stringi
包
library(stringi)
(Res <- stri_list2matrix(a))
# [,1] [,2] [,3] [,4]
# [1,] "3" "4" "3" "6"
# [2,] "4" "5" "9" "7"
# [3,] "5" "7" NA "8"
# [4,] "7" NA NA "10"
# [5,] "8" NA NA NA
如果您希望它们是数字类,可以添加以下行
(Res <- matrix(as.numeric(Res), ncol = ncol(Res)))
# Res
# [,1] [,2] [,3] [,4]
# [1,] 3 4 3 6
# [2,] 4 5 9 7
# [3,] 5 7 NA 8
# [4,] 7 NA NA 10
# [5,] 8 NA NA NA
答案 1 :(得分:2)
您可以尝试这样的事情:
#create some dummy date
a<-list(c(3,4,5,7,8),c(4,5,7),c(3,9),c(6,7,8,10))
#get the longest vector
m<-max(sapply(a,length))
#fill in the sublists with NAs so that they all have the same length
as.data.frame(sapply(a,function(x){length(x)<-m;x}))
# V1 V2 V3 V4
#1 3 4 3 6
#2 4 5 9 7
#3 5 7 NA 8
#4 7 NA NA 10
#5 8 NA NA NA
答案 2 :(得分:1)
您可以执行以下操作: 以下添加零而不是NA
a<-list(c(3,4,5,7,8),c(4,5,7),c(3,9),c(6,7,8,10))
n.col <- vapply(a, length, 1L)
mat <- matrix(0, nrow = length(a), ncol = max(n.col))
rand <- cbind(rep(seq_along(n.col), times = n.col), sequence(n.col))
M[rand] <- unlist(a, use.names = FALSE)
M2 <- t(M)
print(M2)
# [,1] [,2] [,3] [,4]
#[1,] 3 4 3 6
#[2,] 4 5 9 7
#[3,] 5 7 0 8
#[4,] 7 0 0 10
#[5,] 8 0 0 0
如果你现在想要NA而不是零,你可以这样做:
M2[M2 == 0] <- NA
print(M2)
# [,1] [,2] [,3] [,4]
#[1,] 3 4 3 6
#[2,] 4 5 9 7
#[3,] 5 7 NA 8
#[4,] 7 NA NA 10
#[5,] 8 NA NA NA