我有以下$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行
答案 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