如何在R中按组和数字提取前x%的行?

Kay*_*aya 2 group-by r dplyr

假设我有这个数据集(不是我使用的原始数据)

data <- data.frame(
  name=c( rep("A",500), rep("B",500), rep("B",500), rep("C",20), rep('D', 100)  ),
  value=c( rnorm(500, 10, 5), rnorm(500, 13, 1), rnorm(500, 18, 1), rnorm(20, 25, 4), rnorm(100, 12, 1) )
)
Run Code Online (Sandbox Code Playgroud)

我希望我的代码

  1. 按降序排列
  2. 并选择前 30% 但不是我的变量的,而是每个名称的行数

我的代码是这样开始的:

data <- data %>%
 arrange(name, value) %>%
Run Code Online (Sandbox Code Playgroud)

我读过 top_frac() 但据我所知,它选择了值的前 x%。

提前致谢!

Rui*_*das 5

这是一个解决方案。它按组选择前 30% 的值name,然后对每组中选择的行进行计数。

library(dplyr)

data %>%
  group_by(name) %>%
  arrange(name, value) %>%
  top_frac(0.30) %>%
  count(name)
#Selecting by value
## A tibble: 4 x 2
## Groups:   name [4]
#  name      n
#  <chr> <int>
#1 A       150
#2 B       300
#3 C         6
#4 D        30
Run Code Online (Sandbox Code Playgroud)

这是可以看到的是,这些数字实际上每个组的30%,name

data %>% count(name) %>% mutate(n = n*0.3)
#  name   n
#1    A 150
#2    B 300
#3    C   6
#4    D  30
Run Code Online (Sandbox Code Playgroud)

如果你想要前 30% 的值,而不考虑前值来自的组,那么必须将上面的代码更改为以下代码。

data %>%
  arrange(name, value) %>%
  top_frac(0.30) %>%
  count(name)
#Selecting by value
#  name   n
#1    A  46
#2    B 420
#3    C  20
Run Code Online (Sandbox Code Playgroud)