按组筛选数据框的n行,每个组的n不同。

3

我希望从我的数据框不同的组中选择不同数量的行。使用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))
2个回答

5
我们可以通过'Species'进行'iris'和'top_rows_desired'的left_join,并按照'Species'进行分组,对first 'n_desired' 的sequence 进行slice,并使用select移除'n_desired'列。
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
@cylondude left_join 函数返回第一个参数即左侧 ('iris') 的行数,同时添加了一个新列 'n_desired',该列的值来自于 'top_rows_desired'。 - akrun

0

为那些无法运行akrun提供的代码的人添加此答案。我也曾经苦恼过这个问题。这个答案解决了在github上提到的{{link2:#2531}问题。

你可能无法运行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)

这可能适用于您。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接