从列表中创建R中的稀疏交叉表

时间:2017-07-25 13:40:04

标签: r list dataframe sparse-matrix

我无法重现样本,但这是我的问题。

我有一个大型列表对象(1.1GB,~3百万个元素)。它看起来与此并无异议:

> head(xx, n = 3)
[[1]]
[1] "Start"                                                                                                                     
[2] "A|B|C"  
[3] "C|C|B"
[4] "Lose"                                                                                                                

[[2]]
[1] "Start"                                          
[2] "B|NULL|NULL"
[3] "Lose"                                    

[[3]]
[1] "Start"                                               
[2] "C|NULL|NULL"
[3] "Win" 

我想要做的是计算嵌套列表中每个步骤之间的转换次数,即,开始转到C | Null | Null的频率,C | Null | Null在大量列表中转到Win的频率。

在一个小的子样本中,我可以使用以下内容(占位符将列表偏移一个):

Transition <-  table(From=unlist(lapply(xx, append, 'Placeholder', 0L)),
                       To=unlist(mapply(c, xx, 'Placeholder')))

创建一个大的列联表对象,其中大部分表都填充了零。但是,对于实际数据,此对象很容易超过2Gb,并且经常因无法创建对象内存错误而失败。

再次在我的小子样本上,我将交叉表恢复为data.frame()对象,该对象将交叉表强制回三列表(From,To,Freq),并且可以手动删除零条目和我的占位符。

我的问题是:有没有办法实现一个“稀疏”的数据框,它可以计算真实的过渡但跳过创建巨大的零填充交叉表?

如果您需要更多信息,请告诉我,我会尽力提供!

1 个答案:

答案 0 :(得分:0)

使用data.table来解决自己的不同方式:

sequence <- unlist(xx)
Transition <- data.table(
                 From = head(sequence, -1L),
                   To = tail(sequence, -1L))
Transition.count <- Transition[, .N, by = c('From', 'To')]