我有一个具有这种结构的大型数据集(数百万条记录):
id | ident1 | ident2
1 A000001 B000001
2 A000001 B000002
................
99 A000001 B000099
.........
337 A000002 B000037
338 A000002 B000043
换句话说,对于每个[ident1],我在[ident2]中有大量条目。我希望能够只选择其中的20个条目(如果小于20条,则只选择其中的一条)。
订单并不重要:所以如果给定的ident1有100个匹配的[ident2],我想要前20个条目,或者20个随机条目,它并不重要。
提前致谢,p。
答案 0 :(得分:6)
尝试
library(dplyr)
df %>%
group_by(ident1) %>%
slice(1:20)
或使用data.table
library(data.table)
setDT(df)[, head(.SD,20), by=ident1]
如果您需要样品
setDT(df)[df[, .I[sample(.N,20, replace=FALSE)], by=ident1]$V1]
如果某些群组的行数少于20
1}}
sample
答案 1 :(得分:3)
作为@akrun的答案,我使用dplyr
,但在我的情况下,你是随机选择观察。
library(dplyr)
df %>%
group_by(ident1) %>%
sample_n(20)
或:
library(dplyr)
df %>%
group_by(ident1) %>%
sample_frac(.2) # randomly select the 20 % from each group
使用plyr
:
ddply(df, .(ident1), function(x, howmany) {
x[sample(seq_len(nrow(x)), howmany), ]
}, howmany = 20)
ddply(df, .(ident1), head, 20)
答案 2 :(得分:2)
基本R选项获取每ident1
的前20行,但不如data.table或dplyr效率高:
df[ave(seq_along(df$ident1), df$ident1, FUN = seq_along) <= 20, ]