2016-01-22 58 views
7

我有以下data.table保险丝熔化/ dcast

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 

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

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

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

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

编辑:

我在寻找既简单又有效的解决方案。这将应用在~30列和〜80列的约40个表格上

+2

尝试'testdt [,lapply(.SD,中位数),VAR1]'但是这是你想要的转置。 – akrun

+1

谢谢@akrun,已经尝试过,但我需要“转置”部分 – Cath

+0

我认为这是*不*性能相关。那是对的吗? – A5C1D2H2I1M1N2O1R2T1

回答

1

如果速度是一个主要关注点,如果您计算出速度是23%(尽管以毫秒为单位)首先是median。随着数据集的大小增长,数据量减少,这一增量也可能会增加。

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 
+0

感谢您的回答我会稍后再学习它我现在不用电脑 – Cath