【问题标题】:Filter n rows of grouped data frame when different n for each group当每组的 n 不同时,过滤 n 行分组数据框
【发布时间】:2016-12-12 05:06:44
【问题描述】:

我想为我的数据框的每组选择不同的行数。我还没有想出一个优雅的方式来用 dplyr 做到这一点。要为每个组选择相同数量的行,我这样完成:

library(dplyr)

iris %>% 
    group_by(Species) %>%
    arrange(Sepal.Length) %>%
    top_n(2)

但我希望能够引用另一个表,其中包含我想要的每个组的行数,如下所示的示例表:

top_rows_desired <- data.frame(Species = unique(iris$Species),
    n_desired = c(4,2,5))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以用 'iris' 和 'top_rows_desired' 按 'Species' 进行 left_join,按 'Species' 分组,slice sequencefirst 'n_desired' 并删除 'n_desired' 列select

    left_join(iris, top_rows_desired, by = "Species") %>%
                         group_by(Species) %>% 
                         arrange(desc(Sepal.Length)) %>%
                         slice(seq(first(n_desired))) %>%
                         select(-n_desired)
    

    【讨论】:

    • 这看起来很可靠。为什么你使用left_join而不是inner_join?两者似乎都适用于这个例子,但我错过了什么吗?
    • @cylondude left_join 在第一个参数中返回相同的行数,即左侧('iris'),并为'top_rows_desired'中的'n_desired'添加了一个新列。
    【解决方案2】:

    只需为那些无法运行akrun provided 的代码的人添加这个答案。我为此挣扎了一段时间。这个答案解决了#2531 mentioned on github的问题。

    您可能无法运行slice,因为您的环境中已经加载了xgboostxgboost 掩盖了导致此问题的 dplyr 的 slice 函数。

    Attaching package: ‘xgboost’
    
    The following object is masked from ‘package:dplyr’:
    
    slice
    
    Warning message:
    package ‘xgboost’ was built under R version 3.4.1 
    

    所以使用

    detach(package: xgboost)
    

    可能对你有用。

    因此我浪费了一个小时。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      相关资源
      最近更新 更多