【问题标题】:Subset condition within category in RR中类别内的子集条件
【发布时间】:2021-09-10 15:22:24
【问题描述】:

我正在使用一个调查数据集 (ESS),其中每波包含几个国家,以及每波中的几个人。它看起来像这样:

Country Wave
AT 1
AT 1
AT 1
AT 2
AT 3
AT 3
AT 4
AT 4
AT 5
AT 6
AT 7
AT 8
AT 9
AT 9
BE 1
BE 2
BE 2
BE 3
BE 4
BE 5
BE 6
BE 7
BE 7
BE 9
BE 9

我想过滤/子集数据以获得一个新的干净数据框,其中包含个国家/地区,这些国家/地区包含在所有波中,范围从 1 到9. 换句话说,我需要根据他们在所有 9 波中都有观察的条件来选择国家。在上面的示例中,只有“AT”会被选中,因为“BE”缺少第 8 波。

这听起来很简单,但我正在努力寻找一种简单的方法来解决它(可能是因为我是 R 新手)。

非常感谢您的帮助。

【问题讨论】:

    标签: r if-statement subset


    【解决方案1】:

    您可以选择Country,其中all 的值在Wave 中从1 到9。

    library(dplyr)
    df1 <- df %>% group_by(Country) %>% filter(all(1:9 %in% Wave)) %>% ungroup
    df1
    
    #   Country  Wave
    #   <chr>   <int>
    # 1 AT          1
    # 2 AT          1
    # 3 AT          1
    # 4 AT          2
    # 5 AT          3
    # 6 AT          3
    # 7 AT          4
    # 8 AT          4
    # 9 AT          5
    #10 AT          6
    #11 AT          7
    #12 AT          8
    #13 AT          9
    #14 AT          9
    

    这也可以写成base R和data.table -

    #Base R
    df1 <- subset(df, as.logical(ave(Wave, Country, 
                  FUN = function(x) all(1:9 %in% x))))
    
    #data.table
    library(data.table)
    setDT(df)[, .SD[all(1:9 %in% Wave)], Country]
    

    【讨论】:

      【解决方案2】:

      在 r 中,通常有几种方法可以解决同一个问题。这是一个细微的变化

      library(dplyr)
      
      df<-data.frame(stringsAsFactors=FALSE,
           Country = c("AT", "AT", "AT", "AT", "AT", "AT", "AT", "AT", "AT", "AT",
                       "AT", "AT", "AT", "AT", "BE", "BE", "BE", "BE", "BE", "BE",
                       "BE", "BE", "BE", "BE", "BE"),
              Wave = c(1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 9, 1, 2, 2, 3, 4, 5, 6,
                       7, 7, 9, 9)
      )
      
      df_new<-df %>%
        mutate(Country=Country %>% as.factor(),Wave=Wave %>% as.factor()) %>%
        group_by(Country,Wave, .drop=FALSE) %>%
        summarize(n=n(), ) %>%
        ungroup() %>%
        group_by(Country) %>%
        summarize(all_waves=if_else(min(n)>0, TRUE, FALSE))
      

      首先按国家和波浪分组并总结每组的总数。然后我们按国家分组,总结最小数量大于0的组。

      【讨论】:

      • 谢谢,对理解这种变化也很有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2022-10-22
      相关资源
      最近更新 更多