使用data.table功能将长结构化data.table重塑为一个广泛的结构?

Raf*_*ael 12 r data.table

> 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
Run Code Online (Sandbox Code Playgroud)

显然,我可以使用包reshape2的fx dcast将data.table从long扩展为long.但是data.table附带了一个重载的括号运算符,它提供了诸如"by"和"group"之类的参数,这让我想知道是否有可能使用它来实现它(对于data.table特定的功能)?

只是手册中的一个随机示例:

DT[,lapply(.SD,sum),by=x]
Run Code Online (Sandbox Code Playgroud)

这看起来很棒 - 但我还没有完全理解它的用法.

我既没有找到方法,也没有找到这方面的例子,也许这是不可能的,也许它甚至不应该 - 所以,明确的"不,不可能,因为......"当然也是一个有效的答案.

Aru*_*run 16

我将选择一个不等组的例子,以便更容易说明一般情况:

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
Run Code Online (Sandbox Code Playgroud)

第一步是使每组"x"的元素/条目数相同.这里,对于x = 1,有3个y值,但对于x = 2,只有2个.因此,我们必须首先用NA修复x = 2,y = 3.

setkey(A, x, y)
A[CJ(unique(x), unique(y))]
Run Code Online (Sandbox Code Playgroud)

现在,得到它的宽格式,我们应该以"x"和组使用as.listv,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用引用设置重新整形列的名称,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
Run Code Online (Sandbox Code Playgroud)

  • 有计划将`melt`和`cast`添加到`data.table`.请看[**FR#2627**](http://r-forge.r-project.org/tracker/index.php?func=detail&aid=2627&group_id=240&atid=978).`data.table`仍在不断发展.有许多功能仍有待发现.所以,我不会限制自己这样做,这个和这个.如果您认为有一个非常常见的操作或有用的操作并不简单,请添加功能请求.MatthewDowle对创意很开放.另请查看data.table邮件列表. (2认同)

Gab*_*abi 10

使用dcast()(现在是默认data.table方法,从版本1.9.5;早期版本使用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
Run Code Online (Sandbox Code Playgroud)

这是快速的,并且不需要setnames().

y在上面的示例中,如果是具有字符级别的因子变量(例如"低","中","高"),这也特别有用- 因为CJ()可能无法按setnames()预期的顺序返回带有变量的宽数据,并且您最终可能会错误地标记您的数据.