【问题标题】:dplyr: select first half (or given proportion) of each groupdplyr:选择每组的前半部分(或给定比例)
【发布时间】:2018-03-16 10:51:19
【问题描述】:

我的需求很简单:我有一个带有分组变量的 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)我不知道如何使它取决于每个组的大小,使用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

但是我可以直接使用dplyr 来执行此操作吗?谢谢

【问题讨论】:

    标签: r dplyr training-data


    【解决方案1】:

    您可以使用n(),它将为您提供分组 df 中的行数。它在top_n 内部不起作用,但在filter 和slice 内部起作用:

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

    或

    df %>% 
      group_by(name) %>% 
      slice(seq(proportion * n()))
    

    【讨论】:

    • 感谢@konvas,这确实非常聪明。我将使用第一个选项,它允许我通过将符号更改为 &gt; 来创建测试 data.frame
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2016-01-18
    • 2020-09-21
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多