dplyr:select 每组的前半部分(或给定比例)
dplyr: select first half (or given proportion) of each group
我的需求很简单:我有一个带有分组变量的 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,因为它用于 train/test 目的的数据拆分)
很多问题都回答了这个问题,但有固定的行数(使用 top_n()
、)我不知道如何根据每个组的大小使用 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
做这个吗?谢谢
您可以使用 n()
,它将为您提供分组 df 中的行数。它在 top_n
中不起作用,但在 filter
和 slice
中起作用:
df %>%
group_by(name) %>%
filter(row_number() <= proportion * n())
或
df %>%
group_by(name) %>%
slice(seq(proportion * n()))
我的需求很简单:我有一个带有分组变量的 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,因为它用于 train/test 目的的数据拆分)
很多问题都回答了这个问题,但有固定的行数(使用 top_n()
、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
做这个吗?谢谢
您可以使用 n()
,它将为您提供分组 df 中的行数。它在 top_n
中不起作用,但在 filter
和 slice
中起作用:
df %>%
group_by(name) %>%
filter(row_number() <= proportion * n())
或
df %>%
group_by(name) %>%
slice(seq(proportion * n()))