将列表重新排列为数据帧和

时间:2015-02-25 11:32:41

标签: r list dataframe

列表中包含不同长度的不同子列表

l
[[1]] 3,4,5,7,8
[[2]] 4,5,7
[[3]] 3,9
[[4]] 6,7,8,10

如何将列表重新排序为cols为子列表1到4的数据框?其余的应该填充NA。那我可以在这个数据框架上使用融化吗?

3 个答案:

答案 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