我正在尝试过滤一个包含n个类别的数据框架,每个类别有n行。 我希望每个类别的dimension
值按另一列revenues
排序,然后选择每个dimension
的前10个值并摆脱其余部分。
我尝试了以下代码片段,但似乎没有达到我想要的效果:
data <- tbl_df(data) %>%
arrange(revenues) %>%
group_by(dimension) %>%
top_n(10)
data <- tbl_df(data) %>%
group_by(dimension) %>%
arrange(revenues, .by_group = TRUE) %>%
top_n(10)
top_n()
中指定按哪一列排序,否则它将默认按数据中的最后一个变量排序。 - Darren Tsaitop_n
已被slice_min
或slice_max
所取代以明确顺序。在dplyr 1.0.10中不会被弃用。
未来更安全的语法是slice_max(revenues, n=10)
表示最大的十个收入,而对于最小的收入使用slice_min
。Slice有许多替代方法。您还可以按照现有的数据库顺序进行切片slice_head
,或者如果您想要一个倾向于较大的收入项目的随机样本,假设替换,slice_sample(n = 10, replace = TRUE, weight_by = revenues)
。 - micstrset.seed(100)
data = data.frame(revenues=rnbinom(100,mu=1000,size=1),
dimension=sample(letters[1:2],100,replace=TRUE))
data %>% top_n(10,revenues)
revenues dimension
1 4191 b
2 1916 a
3 2397 b
4 1895 a
5 2013 a
6 2351 b
7 3889 b
8 2503 a
9 3909 a
10 2779 b
data %>% group_by(dimension) %>% top_n(10,revenues)
注意,上述代码将获取前10个值,这意味着在并列情况下(比如有2个排名第一),你会得到超过10个值。例如,在这个数据中:
# A tibble: 21 x 2
# Groups: dimension [2]
revenues dimension
<dbl> <fct>
1 1663 a
2 1663 a
3 1753 a
4 1849 a
5 1856 a
6 1869 a
7 1895 a
8 1916 a
9 2013 a
10 2503 a
# … with 11 more rows
unlist(tapply(data$revenues,data$dimension,function(i)-sort(-i)[1:10]))
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 b1 b2 b3 b4 b5 b6
3909 2503 2013 1916 1895 1869 1856 1849 1753 1663 4191 3889 2779 2397 2351 1479
b7 b8 b9 b10
1414 1340 1327 1274
group_by + top_n()
: data %>% group_by(dimension) %>% top_n(10,revenues) %>%
arrange(dimension,desc(revenues)) %>% pull(revenues)
[1] 3909 2503 2013 1916 1895 1869 1856 1849 1753 1663 1663 4191 3889 2779 2397
[16] 2351 1479 1414 1340 1327 1274
data %>% arrange(desc(revenues)) %>%
group_by(dimension) %>% do(head(.,10))
data <- tbl_df(data) %>%
group_by(dimension) %>%
arrange(desc(revenues),.by_group=TRUE) %>%
top_n(10,revenues)
dplyr
,除非您是dplyr
的专家。这可能会使您完全不必写问题。 - DJJ