7

R 中的 data.table 包提供了以下选项:

其中: 'TRUE' 返回与 'i' 匹配的 'x' 的整数行号。

但是,我看不到j在使用 建立的组内获得“x”的整数行号的方法by

例如,给定...

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6))

...我想知道每个 y 值的 DT 索引。

对我而言,价值在于我正在使用与另一个数据结构 (ADS) 并行的 data.table,我打算基于 data.table 的有效计算分组对其执行分组计算。

例如,假设 ADS 是一个向量,DT 中的每一行都有一个值:

ADS<-sample(100,nrow(DT))

作为一种解决方法,如果我首先向 data.table 添加一个新的序列列,我可以计算由 DT$y 组确定的 ADS 的组均值。

DT[,seqNum:=seq_len(nrow(DT))]
DT[,mean(ADS[seqNum]),by=y]

这给出了我想要的结果,但代价是添加了一个新列。

我意识到在这个例子中我可以使用 tapply 得到相同的答案:

tapply(ADS,DT$y,mean)

但是,我将无法获得 data.tables 高效分组的性能​​优势(尤其是在索引“by”列时)。

也许我忽略了一些语法???

也许这是添加到 data.table 的一个简单功能,我应该请求它(眨眼,眨眼)???

建议的语法:可选地将 '.which' 设置为组索引,允许编写:

DT[,mean(ADS[.which]),by=y,which=TRUE]
4

2 回答 2

12

data.table1.8.3 开始可用,您可以.Ijadata.table中使用按组获取行索引...

DT[ , list( yidx = list(.I) ) , by = y ]
#   y  yidx
#1: 1 1,4,7
#2: 3 2,5,8
#3: 6 3,6,9
于 2014-06-14T14:41:43.283 回答
6

一个键控的 data.table 将被排序,以便组存储在连续的块中。在这种情况下,您可以使用.N来提取分组索引信息:

DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6))
setkey(DT, y)

ii <- DT[,.N, by=y]
ii[, start := cumsum(N) - N[1] + 1][,end := cumsum(N)][, N := NULL]
#    y start end
# 1: 1     1   3
# 2: 3     4   6
# 3: 6     7   9

(就个人而言,我可能会像您建议的那样添加一个索引列seqNum。看起来更简单,我认为它不会对性能产生太大影响,除非您真的在突破极限。)

于 2012-09-13T18:44:14.967 回答