【问题标题】:finding first few rows in groups within data.table [duplicate]在data.table中查找组中的前几行[重复]
【发布时间】:2018-05-24 11:58:05
【问题描述】:

对于大数据表,我们需要不时快速浏览一下,尤其是在寻找一些模式时。但是前面有一张长桌,第一眼就很难看穿。 我想问一下,我们可以只得到每组的前几行吗?像DT[1:5, .(X,Y), by=.(Z)] 这样的东西? 这是参考代码。

library(data.table)
DT <- data.table(X=rep(letters[1:3], 50), Y=rep(LETTERS[1:3],each=50))[,Z:=paste0(X,"-",Y)]

setkey(DT,Z)

DT[,.(X,Y), by=.(Z)]
#        Z X Y
#   1: a-A a A
#   2: a-A a A
#   3: a-A a A
#   4: a-A a A
#   5: a-A a A
#  ---        
# 146: c-C c C
# 147: c-C c C
# 148: c-C c C
# 149: c-C c C
# 150: c-C c C

我想这样做:

#        Z X Y
#   1: a-A a A
#   2: a-A a A
#   3: a-A a A
#   4: a-A a A
#   5: a-A a A
#   6: b-B a B
#   7: b-B a B
#   8: b-B a B
#   9: b-B a B
#  10: b-B a B
#  11: c-C c C
#  12: c-C c C
#  13: c-C c C
#  14: c-C c C
#  15: c-C c C

只需选择前几行(例如 5 行),这样就不会折叠细节。请指教,谢谢

--------

为了表达对社区的感谢,这是我根据@Frank 和许多其他朋友的反馈得出的结论。

根据另一个相同主题的帖子,人们建议生成索引,然后生成目标表。 步骤如下:

  • 按我从未听说过的.I[] 创建索引。

DT[,.I[1:2], by=Z]

> DT[,.I[1:2], by=Z]
      Z  V1
 1: a-A   1
 2: a-A   2
 3: a-B  18
 4: a-B  19
 5: a-C  35
 6: a-C  36
 7: b-A  51
 8: b-A  52
 9: b-B  68
10: b-B  69
11: b-C  84
12: b-C  85
13: c-A 101
14: c-A 102
15: c-B 117
16: c-B 118
17: c-C 134
18: c-C 135

V1 是索引!所以,我可以抓住并使用它。

  • 将索引插入原始DT,然后BINGO

这很酷

> DT[DT[,.I[1:2], by=Z]$V1]
    X Y   Z
 1: a A a-A
 2: a A a-A
 3: a B a-B
 4: a B a-B
 5: a C a-C
 6: a C a-C
 7: b A b-A
 8: b A b-A
 9: b B b-B
10: b B b-B
11: b C b-C
12: b C b-C
13: c A c-A
14: c A c-A
15: c B c-B
16: c B c-B
17: c C c-C
18: c C c-C

谢谢,伙计们

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这行得通吗?

    # adding an index and select on that
    DT[ , idx := 1:.N, by = "Z"]
    DT[idx <= 5 ]
    

    【讨论】:

    • 仅供参考,DT[rowid(Z) &lt;= 5] 也可以
    • @Frank 谢谢,data.table 太酷了。
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多