根据R中的另一个分组,从分组变量中选择样本

时间:2020-09-01 10:56:42

标签: r dplyr

我有以下具有1000行的数据框; 10个城市,每个城市有100行,我想按城市中的Year随机选择10个名称,并且应该选择10个样本名称应至少来自该城市中至少一个年份,即城市1的10个名称不应来自例如从1996年开始。

       City Year   name   
1       1   1996   b
2       1   1996   c
3       1   1997   d
4       1   1997   e 
...
101     2   1996   f
102     2   1996   g
103     2   1997   h
104     2   1997   i

所需的最终样品数据

       City Year   name   
1       1   1996   b
2       1   1998   c
3       1   2001   d
...
11      2   1997   g
12      2   1999   h
13      2   2005   b
...
21      3   1998   a
22      3   2010   c
23      3   2005   d

样本数据

df1 <- data.frame(City = rep(1:10, each = 100), 
                  Year = rep(1996:2015, each = 5), 
                  name = rep(letters[1:25], 40))

我无法为所有10个城市按年随机选择10个样本名称(不重复年份-除非城市的年数少于10年),该如何解决?

最终抽样应在每个城市中使用10个名称,除非该城市中的名称少于10个,否则不应重复年份。

谢谢。

1 个答案:

答案 0 :(得分:1)

首先按City分组,然后使用sample_n对子数据帧进行采样。
然后按CityYear分组,并从sample中按name每组一个元素。不要忘记设置RNG种子以使结果可重复。

library(dplyr)

set.seed(2020)

df1 %>%
  group_by(City) %>%
  sample_n(min(n(), 10)) %>%
  ungroup() %>%
  group_by(City, Year) %>%
  summarise(name = sample(name, 1))
#`summarise()` regrouping output by 'City' (override with `.groups` argument)
## A tibble: 4 x 3
## Groups:   City [2]
#   City  Year name 
#  <int> <int> <chr>
#1     1  1996 b    
#2     1  1997 e    
#3     2  1996 f    
#4     2  1997 h  

数据

df1 <- read.table(text = "
       City Year   name   
1       1   1996   b
2       1   1996   c
3       1   1997   d
4       1   1997   e 
101     2   1996   f
102     2   1996   g
103     2   1997   h
104     2   1997   i
", header = TRUE)

编辑

不是重新发明轮子,而是使用软件包sampling,函数strata获取数据集中的索引,然后filter包含其对应的行。

library(dplyr)
library(sampling)

set.seed(2020)

df1 %>%
  mutate(row = row_number()) %>%
  filter(row %in% strata(df1, stratanames = c('City', 'Year'), size = rep(1, 1000), method = 'srswor')$ID_unit) %>%
  select(-row) %>%
  group_by(City) %>%
  sample_n(10) %>%
  arrange(City, Year)