每个条目选择20个第一行

时间:2014-12-04 11:02:11

标签: r data-manipulation

我有一个具有这种结构的大型数据集(数百万条记录):

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。

3 个答案:

答案 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

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)

选择前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, ]