2016-12-31 18 views
1

我正在尋找一種將列表轉換爲矩陣的快速方法,其中包含重複的1:5模式。例如,列表mat看起來像這樣。該列表和重複模式的長度可達數千個值,因此快速方法將是理想的。在將列表轉換爲矩陣的同時添加重複圖案R

我可以使用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 

回答

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

這裏是Map的另一種選擇。我們得到list元素的sequencelapply,cbind的對應元素list使用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,我們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 
+0

@DavidArenburg謝謝,加入'reshape2' – akrun

+0

@DavidArenburg我試圖'setDT'和'data.table(墊)',但它不是在1.10.0即'熔體加工(數據。臺墊))# 墊 1:5 2:1,4,5- 3:3,1 4:4,6,5,3 警告消息: 在melt.data.table(data.table(MAT)): ' – akrun