r语言 - 选择前几分 n 行(按值),但如果 n 行的小数小于 1,则保留所有行



作为一个例子,我有这个data.frame

df <- structure(list(var_1 = c(7578L, 21L, 4534L, 53L, 457L, 621L, 
878L, 636L, 1111L, 25L, 23L, 99L), var_2 = c(1L, 1L, 2L, 2L, 
      2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), class = "data.frame", row.names = c(NA, 
                                                                            -12L))

我想按var_2分组,然后找到每个组中的前 30%。但是,如果一个组的 30% 的行小于 1,那么我想保留所有行。

所以我做了这个函数(改编自 dplyr 的top_n函数(:

top_frac_keep_lower <- function(x, n, wt) {
if ((nrow(x) * {{ n }}) < 1) {
x
} else {
top_frac(x, {{ n }}, {{ wt }})
}
}

如果首先筛选 var_2 中的组之一,则该函数有效:

df_var_2_1 <- filter(df, df$var_2 == 1)
top_frac_keep_lower(df_var_2_2, 0.3, var_1)
var_1 var_2
1  7578     1
2    21     1
df_var_2_2 <- filter(df, df$var_2 == 2)
top_frac_keep_lower(df_var_2_2, 0.3, var_1)
var_1 var_2
1  4534     2
2   878     2
3  1111     2

但是如果你使用grouped_by它不起作用:

df %>% 
group_by(var_2) %>% 
top_frac_keep_lower(n = 0.3, var_1)
# A tibble: 3 x 2
# Groups:   var_2 [1]
var_1 var_2
<int> <int>
1  4534     2
2   878     2
3  1111     2

那么为什么这不起作用呢?我错过了什么?

我们可以使用group_split,因为函数使用nrow

library(purrr)
library(dplyr)
df %>% 
group_split(var_2) %>% 
map_dfr(top_frac_keep_lower, n = 0.3, var_1)

最新更新