【问题标题】:Select sample from a grouping variable depending on another grouping in R根据 R 中的另一个分组从分组变量中选择样本
【发布时间】:2020-09-01 23:35:18
【问题描述】:

我有以下 1,000 行的数据框; 10 个城市,每个城市有 100 行,我想在城市中按年份随机选择 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 个。

谢谢。

【问题讨论】:

    标签: r dplyr


    【解决方案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)
    

    【讨论】:

    • 谢谢@Rui。但是,这实际上打印了一个城市下所有年份的一年,所以如果我在城市 1 有 20 年,那么这些年份的每一年都会产生 20 行,而不是应该来自城市 1 的最多 10 个样本。改正了吗?
    • @SamuelOnyango 完成,立即查看。
    • 嗨@Rui,它仍然没有这样做。 sample_n 行为每个地区留下 10 行,并且根据您之前从 sample_n 中选择的重复年份,summary 行将进一步减少它。我还更新了问题以包含示例数据以供查看。再次感谢。
    • @SamuelOnyango 看看新代码是不是你想要的。
    • 谢谢@Rui,我一定会用这个作为答案。我最终得到了所需的数据点。但是,我只是对过滤线感到好奇,它为每个城市留下了独特的 20 年,这将每个城市的行从 100 减少到 20,然后从中选择 10。
    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多