繁体   English   中英

在将列表转换为R中的矩阵时添加重复模式

[英]adding repeating pattern while converting list to matrix in R

我正在寻找一种将列表转换为矩阵的快速方法,该矩阵的另一列包含重复的1:5模式。 例如,列表mat看起来像这样。 该列表和重复模式的长度可以达到数千个值,因此一种快速的方法将是理想的。

我可以使用melt将列表转换为矩阵(尽管可能不适用于大型矩阵),但是,我很难使重复模式起作用。

矩阵看起来像这样

mat

[[1]]
[1] 5

[[2]]
[1] 1 4 5

[[3]]
[1] 3 1

[[4]]
[1] 4 6 5 3

输出应包含列表的值以及包含1:5重复模式的索引列,具体取决于列表中每个索引的长度。 例如, mat[[4]]包含4个值,因此索引列应包含一个1:4的值

output

[,1] [,2]
  5  1
  1  1
  4  2
  5  3
  3  1
  1  2
  4  1
  6  2
  5  3
  3  4
mat <- list(5, c(1,4,5), c(3,1), c(4,6,5,3))  ## your example data

我们可以使用基本操作:

cbind( unlist(mat), sequence(lengths(mat)) )

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

或者,

cbind( unlist(mat), unlist(lapply(mat, seq_along)) )

这是Map另一个选择。 我们使用lapply获得每个list元素的sequence ,使用Map cbind list的相应元素并rbind

do.call(rbind, Map(cbind, mat, lapply(mat, seq_along)))
#     [,1] [,2]
#[1,]    5    1
#[2,]    1    1
#[3,]    4    2
#[4,]    5    3
#[5,]    3    1
#[6,]    1    2
#[7,]    4    1
#[8,]    6    2
#[9,]    5    3
#[10,]   3    4

或与data.table ,我们meltlist ,以一个2列data.frame ,将其转换为data.tablesetDT并分配( :=由“L1”分组后)“L1”到“L1”的序列

library(data.table)
setDT(melt(mat))[, L1 := seq_len(.N), L1][]
#    value L1
# 1:     5  1
# 2:     1  1
# 3:     4  2
# 4:     5  3
# 5:     3  1
# 6:     1  2
# 7:     4  1
# 8:     6  2
# 9:     5  3
#10:     3  4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM