[英]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
,我们melt
的list
,以一个2列data.frame
,将其转换为data.table
与setDT
并分配( :=
由“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.