簡體   English   中英

使用data.table功能將長結構化data.table重塑為一個廣泛的結構?

[英]Reshape long structured data.table into a wide structure using data.table functionality?

> library(data.table)
> A <- data.table(x = c(1,1,2,2), y = c(1,2,1,2), v = c(0.1,0.2,0.3,0.4))
> A
   x y   v
1: 1 1 0.1
2: 1 2 0.2
3: 2 1 0.3
4: 2 2 0.4
> B <- dcast(A, x~y)
Using v as value column: use value.var to override.
> B
  x   1   2
1 1 0.1 0.2
2 2 0.3 0.4

顯然,我可以使用包reshape2的fx dcast將data.table從long擴展為long。 但是data.table附帶了一個重載的括號運算符,它提供了諸如“by”和“group”之類的參數,這讓我想知道是否有可能使用它來實現它(對於data.table特定的功能)?

只是手冊中的一個隨機示例:

DT[,lapply(.SD,sum),by=x]

這看起來很棒 - 但我還沒有完全理解它的用法。

我既沒有找到方法,也沒有找到這方面的例子,也許這是不可能的,也許它甚至不應該 - 所以,明確的“不,不可能,因為......”當然也是一個有效的答案。

我將選擇一個不等組的例子,以便更容易說明一般情況:

A <- data.table(x=c(1,1,1,2,2), y=c(1,2,3,1,2), v=(1:5)/5)
> A
   x y   v
1: 1 1 0.2
2: 1 2 0.4
3: 1 3 0.6
4: 2 1 0.8
5: 2 2 1.0

第一步是使每組“x”的元素/條目數相同。 這里,對於x = 1,有3個y值,但對於x = 2,只有2個。 因此,我們必須首先用NA修復x = 2,y = 3。

setkey(A, x, y)
A[CJ(unique(x), unique(y))]

現在,為了使其格式化,我們應該按“x”分組並在v上使用as.list ,如下所示:

out <- A[CJ(unique(x), unique(y))][, as.list(v), by=x]
   x  V1  V2  V3
1: 1 0.2 0.4 0.6
2: 2 0.8 1.0  NA

現在,您可以使用帶有setnames引用設置重新整形列的名稱,如下所示:

setnames(out, c("x", as.character(unique(A$y)))

   x   1   2   3
1: 1 0.2 0.4 0.6
2: 2 0.8 1.0  NA

使用dcast() (現在是版本1.9.5的默認data.table方法;早期版本使用dcast.data.table ),如

> dcast(A,x~y)
Using 'v' as value column. Use 'value.var' to override
   x   1   2   3
1: 1 0.2 0.4 0.6
2: 2 0.8 1.0  NA

這很快並且不需要setnames()

當上例中的y是具有字符級別的因子變量時,它也特別有用 - 例如'低','中','高' - 因為CJ()可能不會返回帶有變量的寬數據。 setnames()期望,你最終可能會錯誤地標記你的數據。

(與Arun的學分)

A[, setattr(as.list(v), 'names', y), by=x]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM