[英]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.