【问题标题】:Select 20 first rows per each entry每个条目选择前 20 行
【发布时间】:2014-12-04 11:02:10
【问题描述】:

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

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.

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    试试

    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]
    

    如果某些组的行数少于20sample

    setDT(df)[,if(.N < 20) .SD else .SD[sample(.N,20, replace=FALSE)], by=group]
    

    【讨论】:

    • 我写的是完全相同的东西,但使用sample_n(20)而不是slice :)
    • @DavidePassaretti 我认为您可以发布它,因为 OP 想要第一个或随机样本。
    • 感谢所有回复。 “dplyr”在我的版本中不可用。我已经安装了“plyr”,但是在操作数据框时它无法识别 %>% ... setDT 似乎可以解决问题(仍然不知道如何,但我会找出答案的!)。谢谢
    • @user3310782 最好将您的版本升级到新版本 (R.3.1.2)。 setDT 将数据帧转换为 data.table
    【解决方案2】:

    作为@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 个 obs:

    ddply(df, .(ident1), head, 20)
    

    【讨论】:

    • 你不知道 plyr 中的等价物吗(我认为 dplyr 不再可供下载)?谢谢
    • @beginneR 确实很奇怪他不能下载这样的包。
    【解决方案3】:

    获取每个ident1 的前 20 行的基本 R 选项是:

    df[ave(seq_along(df$ident1), df$ident1, FUN = seq_along) <= 20, ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多