2016-01-22 141 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