按列分组data.frame并根据数字向量选择行数

时间:2017-11-03 09:14:17

标签: r select dplyr grouping rows

我们说我有一个如下所示的data.frame:

df = read.table(text = 'A   B
                11 98
                11 87
                11 999
                11 22
                12 34
                12 34
                12 44
                12 98
                17 77
                17 67
                17 87
                17 66
                33 6
                33 45
                33 12
                33 10', header = TRUE)

我需要按照dfA进行分组,并根据以下向量仅选择给定数量的行:

n_rows = c(2, 3, 4, 2)

这样第一组只有2行(无论顺序如何),第二组只有3行等......

这是我的预期输出:

            A   B
            11 98
            11 87
            12 34
            12 34
            12 44
            17 77
            17 67
            17 87
            17 66
            33 6
            33 45

我尝试使用dplyr执行以下操作:

  df %>% 
  group_by(A) %>% 
  top_n(n = n_rows, wt =B)

但我收到以下错误:

  

错误:n必须是标量整数

有什么建议吗?

感谢

4 个答案:

答案 0 :(得分:3)

另一个基本R选项,

do.call(rbind, Map(function(x, y) x[seq(y),], split(df, df$A), n_rows))

给出,

      A  B
11.1  11 98
11.2  11 87
12.5  12 34
12.6  12 34
12.7  12 44
17.9  17 77
17.10 17 67
17.11 17 87
17.12 17 66
33.13 33  6
33.14 33 45

答案 1 :(得分:2)

这是一种可能性,首先分割data.frame然后使用map2

library(dplyr)
library(purr)
df %>% split(.$A) %>%
  map2_dfr(n_rows,head)

#     A  B
# 1  11 98
# 2  11 87
# 3  12 34
# 4  12 34
# 5  12 44
# 6  17 77
# 7  17 67
# 8  17 87
# 9  17 66
# 10 33  6
# 11 33 45

如果订单不重要,您不需要top_nhead工作得很好(也更快),否则只需将head替换为top_n }。

修改

这也是一个整洁的解决方案,一些字符更长但可能更令人满意,因为你不能分开相同"种类的东西"而是完全在data.frame内部工作(相同的输出)。

df %>% nest(B) %>% 
  mutate(data = map2(data,n_rows,head)) %>%
  unnest

答案 2 :(得分:2)

以下是Google play console > Game Services > Testing > Add tester

的选项
top_n

如果我们不是在寻找library(tidyverse) df %>% split(., .$A) %>% map2_df(., n_rows, ~ top_n(., .y, wt = .$B)) ,那么另一个选项是top_n

slice

答案 3 :(得分:2)

在基础R中,您可以执行以下操作:

df2 <- data.frame()

for (i in seq_along(unique(df$A))) {
   df2 <- rbind(df2, df[df$A == unique(df$A)[i], ][1:n_rows[i], ])
}

> df2
    A  B
1  11 98
2  11 87
5  12 34
6  12 34
7  12 44
9  17 77
10 17 67
11 17 87
12 17 66
13 33  6
14 33 45