【发布时间】: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