我们说我有一个如下所示的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)
我需要按照df
对A
进行分组,并根据以下向量仅选择给定数量的行:
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
必须是标量整数
有什么建议吗?
感谢
答案 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_n
,head
工作得很好(也更快),否则只需将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