【发布时间】:2015-07-22 00:23:17
【问题描述】:
我需要有效地“展开” R data.frame 中的列表列。例如,如果我有一个 data.frame 定义为:
dbt <- data.frame(values=c(1,1,1,1,2,3,4),
parm1=c("A","B","C","A","B","C","B"),
parm2=c("d","d","a","b","c","a","a"))
然后,假设分析生成一列作为列表,类似于以下输出:
agg <- aggregate(values ~ parm1 + parm2, data=dbt,
FUN=function(x) {return(list(x))})
聚合后的 data.frame 看起来像(其中 class(agg$values) == "list"):
parm1 parm2 values
1 B a 4
2 C a 1, 3
3 A b 1
4 B c 2
5 A d 1
6 B d 1
我想展开“值”列,在所有 data.frame 行中以有效的方式为列表的每个元素重复 parm1 和 2 值(添加更多行)。
在顶层,我编写了一个函数,该函数在应用中调用的 for 循环中进行展开。 真的效率低下,(聚合的 data.frame 大约需要一个小时来创建,近 24 小时来展开,完全展开的数据有大约 50 万条记录)。我正在使用的顶层是:
unrolled.data <- do.call(rbind, apply(agg, 1, FUN=unroll.data))
该函数只是在值列对象上调用 unlist() 然后在 for 循环中构建一个 data.frame 对象作为返回对象。
环境有些受限,我无法使用 tidyr、data.table 和 splitstackshape 库,它不仅需要是 base:: 中的函数,而且仅限于 v3.1.1 及之前版本中可用的函数。因此this (not really a duplicate) question 中的答案不适用。
有什么更快的建议吗?
谢谢!
【问题讨论】:
-
谢谢,但在这种情况下 tidyr 库不可用。其他想法?
-
不幸的是 splitstackshape 或 data.table 也不是(感谢参考问题,我没有看到它)。