我无法重现样本,但这是我的问题。
我有一个大型列表对象(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),并且可以手动删除零条目和我的占位符。
我的问题是:有没有办法实现一个“稀疏”的数据框,它可以计算真实的过渡但跳过创建巨大的零填充交叉表?
如果您需要更多信息,请告诉我,我会尽力提供!
答案 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')]