2016-01-21 149 views
3

什麼是traspose移調一個data.table(列名 - >輸出的第一列)

> dt <- data.table(x = c(1, 1, 3, 1, 3, 1, 1), y = c(1, 2, 1, 2, 2, 1, 1)) 
> dt 
    x y 
1: 1 1 
2: 1 2 
3: 3 1 
4: 1 2 
5: 3 2 
6: 1 1 
7: 1 1 

到最有效的方法:

> output 
    cn v1 v2 v3 v4 v5 v6 v7 
1: x 1 1 3 1 3 1 1 
2: y 1 2 1 2 2 1 1 

dcast.data.table應該是有效的,但我無法弄清楚它究竟是如何做

回答

7

如何data.table::transpose

data.table(cn = names(dt), transpose(dt)) 
# cn V1 V2 V3 V4 V5 V6 V7 
#1: x 1 1 3 1 3 1 1 
#2: y 1 2 1 2 2 1 1 

如果你真的關心效率,這可能會更好:

tdt <- transpose(dt)[, cn := names(dt)] 
setcolorder(tdt, c(ncol(tdt), 1:(ncol(tdt) - 1))) 
tdt 
# cn V1 V2 V3 V4 V5 V6 V7 
#1: x 1 1 3 1 3 1 1 
#2: y 1 2 1 2 2 1 1 

transpose似乎有點快於t(它調用do_transpose),但不大幅上漲。我猜想這兩種實現大致接近非現場轉置算法的效率上限。

Dt <- data.table( 
    x = rep(c(1, 1, 3, 1, 3, 1, 1), 10e2), 
    y = rep(c(1, 2, 1, 2, 2, 1, 1), 10e2)) 

all.equal(data.table(t(Dt)), data.table(transpose(Dt))) 
#[1] TRUE 

microbenchmark::microbenchmark(
    "base::t" = data.table(t(Dt)), 
    "data.table::transpose" = data.table(transpose(Dt)) 
) 
#Unit: milliseconds 
#     expr  min  lq  mean median  uq  max neval 
#base::t    415.4200 434.5308 481.4373 458.1619 507.9556 747.2022 100 
#data.table::transpose 409.5624 425.8409 474.9709 444.5194 510.3750 685.0543 100 
+1

不知道它與僅僅'data.table(cn = names(dt),t(dt))有什麼不同? –

+1

@David Arenburg好問題;它看起來像所有[真正的工作是在C完成](https://github.com/Rdatatable/data.table/blob/d607425b44155916415485e263cd830828903ab2/src/transpose.c)。我把't'作爲基準並將其添加到我的答案中。 – nrussell

+0

@DavidArenburg,和其他本地的data.table :: function一樣,我猜它是一樣高效的。 這也是在 還聲稱是什麼https://cran.r-project.org/web/packages/data.table/data.table.pdf 我有點尷尬的是這個問題實際上是多麼容易。 我應該在data.table文檔的'轉置'上按Ctrl + F,而不是使用Google搜索。 – Amitai