保险丝融化/ dcast一步到位

Cat*_*ath 7 r data.table

我有以下内容 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
Run Code Online (Sandbox Code Playgroud)

我需要为每个都var1设置每个的中值p*,p*应该是行和var1列中不同的唯一值.
所以,我正在寻找这个输出:

 variable  a  b
1       p1  2  5
2       p2 12 15
Run Code Online (Sandbox Code Playgroud)

我发现最简单的方法是:

dcast(melt(testdt, id.vars = "var1", measure.vars = c("p1", "p2")),
      variable ~ var1,
      value.var = "value",
      fun.aggregate = median)
Run Code Online (Sandbox Code Playgroud)

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

我知道recast了的reshape2包可以做的伎俩recast(testdt, variable~var1, fun=median, id.var="var1"),但我想,以避免加载另一个包.

编辑:

我正在寻找简单而有效的解决方案.这将应用于具有~300列和~80行的~40个表的列表中

man*_*ark 1

如果速度是首要考虑因素,那么如果您计算第一个,则速度会略微提升约 23%(尽管以毫秒为单位)median。随着数据集大小的增加,由于需要融化的数据越来越少,这个增量也可能会增加。

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

基准

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
Run Code Online (Sandbox Code Playgroud)