【问题标题】:fuse melt/dcast in one step一步熔断/dcast
【发布时间】:2016-01-22 10:28:33
【问题描述】:

我有以下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

我需要每个p* 的每个var1 的中值,p* 应该在行中,var1 的不同唯一值在列中。
所以,我正在寻找这个输出:

 variable  a  b
1       p1  2  5
2       p2 12 15

我找到的最简单的方法是:

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

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

我知道 reshape2 包的recast 可以用recast(testdt, variable~var1, fun=median, id.var="var1") 解决问题,但我想避免加载另一个包。

编辑:

我正在寻找一种既简单又高效的解决方案。这将应用于具有约 300 列和约 80 行的约 40 个表的列表

【问题讨论】:

  • 试试testdt[,lapply(.SD, median) , var1],但这是你想要的转置。
  • 感谢@akrun,已经尝试过了,但我需要“转置”部分
  • @AnandaMahto hi Ananda :-) 实际上,越快越好...(我会为 36 个 data.tables 这样做,在一个列表中,有 ~(100-300) 列 x(1到 10) 行)
  • 也许我该做一些基准测试了...

标签: r data.table


【解决方案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

【讨论】:

  • 谢谢你的回答,我以后会好好学习的,我现在没有电脑
猜你喜欢
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2018-11-05
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多