dplyr:选择每组的前半部分(或给定比例)

时间:2018-03-16 10:51:20

标签: r dplyr training-data

我的需求很简单:我有一个带有分组变量的data.frame,如下所示:

library(dplyr)
proportion = 0.5; set.seed(1)
df = data.frame(id=1:6, name=c("a", "a", "b"), value=rnorm(6)) %>% arrange(name)

我想只保留每组的前半部分(按id排序)。 (我想使用可修改的比例而不是一半,比如0.65,因为它是用于列车/测试目的的数据分割)

许多问题都会回答这个问题,但是使用固定行数(使用top_n()here)我不知道如何使用{{1}使其依赖于每个组的大小}。我不希望dplyr,因为它会破坏sample_frac()顺序。 但是,我使用自定义函数分两步找到解决方案:

id

但我可以直接使用myfunc = function(data, prop){head(data, nrow(data)*prop)} splitted.data = split(df, df$name) lapply(splitted.data, myfunc, prop=proportion) %>% bind_rows() #### id name value #### 1 1 a -0.6264538 #### 2 2 a 0.1836433 #### 3 3 b -0.8356286 执行此操作吗?感谢

1 个答案:

答案 0 :(得分:3)

您可以使用[data-lang='it'] .product1 { } 来获取分组df中的行数。它在n()内无效,但在top_nfilter内有效:

slice

df %>% 
  group_by(name) %>% 
  filter(row_number() <= proportion * n())