我已经看到了几个关于将矩阵转换成列表的问题(不清楚为什么你会想要这个)但是我一直无法找到相反的操作。
基本上,关注
# 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.frame
,as.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)。
答案 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))