【问题标题】:determining row indices of data.table group members确定 data.table 组成员的行索引
【发布时间】:2012-09-06 20:51:15
【问题描述】:

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

其中:‘TRUE’返回‘i’的‘x’的整数行号 匹配到。

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

例如,给定...

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

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

对我而言,价值在于我正在使用与另一个数据结构 (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]

【问题讨论】:

  • 恐怕我没跟上。你能举一个你想在 ADS 和 DT 之间执行的计算的例子吗?
  • 蓝色,我确实给出了一个工作示例......我的最后一行代码是使用来自 DT 的索引计算 ADS 中的分组平均值。在我的 real 应用程序中,ADS 数据结构不是一个向量,而是一个“GenomicRanges”对象,我的 DT 是关于范围的元数据。无论如何,下面的 Josh 和 Matthew 都在“处理此案”。谢谢!

标签: r data.table


【解决方案1】:

data.table 1.8.3 起可用,您可以在jdata.table 中使用.I 按组获取行索引...

DT[ , list( yidx = list(.I) ) , by = y ]
#   y  yidx
#1: 1 1,4,7
#2: 3 2,5,8
#3: 6 3,6,9

【讨论】:

    【解决方案2】:

    键控的 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 那样添加一个索引列。看起来更简单,我认为它不会对性能产生太大影响,除非您真的在挑战极限。)

    【讨论】:

    • +11! (这是一个阶乘吗?)而且,是的,OP(就是我)真的想要.I(或者.which,当which = TRUE)。是否已提交实施?
    • @josh-obrien,我不喜欢添加 seqNum,因为它假定没有 seqNum 列已经在使用中,并且它是对我不想修改的对象的破坏性更改。谢谢。
    • @malcook 是的FR#1962“添加.Ix.SD 的行号)以及.N.SD.BY”。会很方便的。
    猜你喜欢
    • 2016-07-03
    • 2022-06-14
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多