R当列表包含“不同大小”的对象时,将列表转换为矩阵

时间:2014-03-24 17:21:17

标签: r matrix dataframe structure

我已经看到了几个关于将矩阵转换成列表的问题(不清楚为什么你会想要这个)但是我一直无法找到相反的操作。

基本上,关注

# ind.dum = data frame with 29 observations and 2635 variables
for (i in 1:ncol(ind.dum))
tmp[[i]]<-which(rollapply(ind.dum[,i],4,identical,c(1,0,0,0),by.column=T))

我得到了2635个对象的列表,其中大部分包含1个值,其中有些值最多为7个。我需要将其转换为具有2635行的矩阵,并根据需要添加尽可能多的列以使每个值适合单独存储单元格(其余为0值)。

我尝试了所有我知道的强制措施(as.data.frameas.matrix ...)以及定义具有最大尺寸但没有任何效果的新矩阵的选项

m<-matrix(0,nrow=2635,ncol=7)
tmp_m<-structure(tmp,dim=dim(m))
Error in structure(tmp,dim=dim(m))dims [product 18445] do not match the length of object [2635]

我确信有一个快速解决方案,所以我希望有人可以帮助我。顺便说一句,我在tmp列表对象中的值是数字,虽然有些是“整数(0)”,即在原始ind.dum矩阵的列中找不到模式c(1,0,0,0)时。

不确定是否有办法使用unlist而不会丢失有关哪些值最初属于同一行的信息......

所需的输出 一个包含2635行和7列的矩阵或数据框,看起来像这样

12 0 0 0 0 0 0
8 14 0 0 0 0 0 
0  0 0 0 0 0 0 
1  4 8 12 0 0 0 
...

值基本上是指特定模式开始的年份。我需要能够使用该信息将此问题与之前描述的早期问题联系起来(请参阅this link)。

3 个答案:

答案 0 :(得分:2)

这是一个快速的替代方案,可以完成您所描述的内容:

首先,样本数据总是有帮助:

LL <- list(1:3, numeric(0), c(1:3,1), 1:7)
LL
# [[1]]
# [1] 1 2 3
# 
# [[2]]
# numeric(0)
# 
# [[3]]
# [1] 1 2 3 1
# 
# [[4]]
# [1] 1 2 3 4 5 6 7

其次,我们将利用一个称为矩阵索引的小技巧,用列表中的值填充空矩阵。

## We need to know how many columns are needed for each list item
Ncol <- vapply(LL, length, 1L)

## M is our empty matrix, pre-filled with zeroes
M <- matrix(0, nrow = length(LL), ncol = max(Ncol))

## IJ is the row/column combination where values need to be inserted
IJ <- cbind(rep(seq_along(Ncol), times = Ncol), sequence(Ncol)) 

## Extract and insert!
M[IJ] <- unlist(LL, use.names = FALSE)

## View the result
M
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    1    2    3    0    0    0    0
# [2,]    0    0    0    0    0    0    0
# [3,]    1    2    3    1    0    0    0
# [4,]    1    2    3    4    5    6    7

答案 1 :(得分:1)

试试这个例子:

do.call(rbind,lapply(ll,
               function(x)
                 if(length(x)==1)c(x,rep(0,6))
               else x))

答案 2 :(得分:0)

我有一个解决方案。

不确定它是否足够好或有任何错误。

LL <- list(1:3, numeric(0), c(1:3, 1), 1:7)

with(data.frame(m <- plyr::rbind.fill.matrix(lapply(LL, matrix, nrow = 1))), replace(m, is.na(m), 0))