我正在寻找一种将列表转换为矩阵的快速方法,其中包含一个包含重复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
答案 0 :(得分:3)
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)) )
答案 1 :(得分:1)
以下是Map
的另一个选项。我们使用sequence
获取list
每个lapply
元素的cbind
,list
使用Map
和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
data.frame
到2列data.table
,将setDT
转换为:=
并分配( 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
)'L1'分组后的'L1'到'L1'的序列
**room**
room_id | nurse_needed
----------------------
1 | 3
2 | 1
3 | 2
**doctor_schedule**
doctor_schedule_id| room_id | date |shift
-------------------------------------------------
1 | 1 |12-30-2016| 1
2 | 2 |12-31-2016| 2
3 | 3 |12-30-2016| 2
4 | 2 |12-30-2016| 2
*nurse_schedule*
nurse_schedule_id | doctor_schedule_id
--------------------------------------
1 | 1
2 | 1
3 | 3
4 | 4