保险丝融化/ dcast一步到位

时间:2016-01-22 10:28:34

标签: r data.table

我有以下$isi = $html->find("div[id=table]", 0)->plaintext;

data.table

我需要为每个library(data.table) testdt <- data.table(var1=rep(c("a", "b"), e=3), p1=1:6, p2=11:16) # var1 p1 p2 #1: a 1 11 #2: a 2 12 #3: a 3 13 #4: b 4 14 #5: b 5 15 #6: b 6 16 设置每个var1的中间值,p*应该在行中,并且列中的p*的唯一值不同。登记/> 所以,我正在寻找这个输出:

var1

我发现获得它的最简单方法是:

 variable  a  b
1       p1  2  5
2       p2 12 15

但我有一种感觉,我在这里遗漏了一些东西(比如最适合的功能),所以我很想知道一种直接的方式(独特的功能)来做同样的事情。

我知道 reshape2 程序包dcast(melt(testdt, id.vars = "var1", measure.vars = c("p1", "p2")), variable ~ var1, value.var = "value", fun.aggregate = median) 可以使用recast执行此操作,但我想避免加载另一个程序包。< / p>

编辑:

我正在寻找既简单又高效的解决方案。这将应用于约40个表的列表,其中包含~300列和~80行

1 个答案:

答案 0 :(得分:1)

如果速度是主要考虑因素,如果首先计算median,则速度会略微提高约23%(尽管以毫秒为单位)。随着数据集的大小增加,这个增量也可能会增加,因为要融化的数据较少。

library(data.table)
dcast(melt(testdt[, lapply(.SD, median), by=var1], id.vars="var1"), variable ~ var1))

基准

Unit: milliseconds

expr                         min       lq    mean   median       uq      max neval
fun.aggregate = median  4.221654 4.453063 4.87418 4.510775 4.579718 35.28569  1000
lapply(.SD, median)     3.196289 3.410711 3.77483 3.461073 3.523096 22.78637  1000