在R

时间:2016-12-31 22:52:08

标签: r list matrix

我正在寻找一种将列表转换为矩阵的快速方法,其中包含一个包含重复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

2 个答案:

答案 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元素的cbindlist使用Maprbind获取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