确定data.table组成员的行索引

时间:2012-09-13 17:38:49

标签: r data.table

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

  

其中:'TRUE'返回'i'的整数行数'i'             匹配到。

但是,我认为无法在j内获取使用by建立的组内的“x”整数行数。

例如,给定......

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]

2 个答案:

答案 0 :(得分:11)

data.table 1.8.3开始提供,您可以在.I的{​​{1}}中使用j来按组获取行索引...

data.table

答案 1 :(得分: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一样。看起来更简单,我不认为它会影响性能太多,除非你真的在推动极限。)