【问题标题】:Select units with observations in multiple time indicators在多个时间指标中选择具有观测值的单位
【发布时间】:2020-07-06 14:21:40
【问题描述】:

我有一个如下所示的数据集:

```
idpers <- c(1,1,1,2,2,3,3,3,3,4,4,4,5)
wave <- c(2008,2009,2012,2008,2011,2005,2006,2007,2008, 2008, 2009, 2010, 2011)
df.short <-  as.data.frame(idpers,wave)
```

这是基于小组调查的多次波次(同一个人 (idpers) 在不同年份接受采访(波次))。我想要做的是只保留在 (2005-08) 之前和 2009 年 (2010-15) 之后的人,但实际上并不重要。

所以基本上是这样的:

```
idpers <- c(1,1,1,2,2,4,4,4)
wave <- c(2008,2009,2012,2008,2011,2008, 2009, 2010)
df.desired <- as.data.frame(idpers, wave)
```

我尝试了不同的方法,例如:

```
Keep only those in waves pre and post?
df %>%
  group_by(idpers)%>%
  select(wave %in% c(2005|2006|2007|2008) & wave %in% c(2010|2011|2012))

#and get the following:
Error in select(., wave %in% c(2005 | 2006 | 2007 | 2008) & wave %in% : unused argument (wave %in% c(2005 | 2006 | 2007 | 2008) & wave %in% c(2010 | 2011 | 2012))
```

非常感谢所有帮助。谢谢!

【问题讨论】:

    标签: r dplyr data.table tidyverse


    【解决方案1】:

    使用dplyr 你可以做到:

    df.short %>% 
      group_by(idpers) %>% 
      filter(any(wave <= 2008)) & any(wave >= 2010)) 
    

    这给了我们:

     idpers  wave
       <dbl> <dbl>
    1      1  2008
    2      1  2009
    3      1  2012
    4      2  2008
    5      2  2011
    6      4  2008
    7      4  2009
    8      4  2010
    

    【讨论】:

    • 你可以不用mutate :) df.short %&gt;% group_by(idpers) %&gt;% filter(any(wave &lt;= 2008) &amp; any(wave &gt;= 2010))
    【解决方案2】:

    我也会像马特一样将any(.)filter-verb 结合使用。不过,您可以跳过变异和过滤,不确定我们正在谈论的数据如何,但这可能会很昂贵,创建 prepost 只是为了在一秒钟后将它们选择出来,并使用 ifelse 从已经是布尔值的向量中创建一个布尔值.还是我错过了什么? :)

    df.short<-structure(list(idpers=c(1,1,1,2,2,3,3,3,3,4,4,4,
    5),wave=c(2008,2009,2012,2008,2011,2005,2006,2007,
    2008,2008,2009,2010,2011)),class="data.frame",row.names=c(NA,
    -13L))
    
    df.short %>% 
      group_by(idpers) %>%
      filter(any(wave %in% 2005:2008) & any(wave %in% 2010:2012))
    

    【讨论】:

      【解决方案3】:

      data.table 你可以这样做:

      library(data.table)
      setDT(df.short)
      df.short[, if (min(wave) <= 2008 && max(wave) >= 2010) .SD, by = idpers]
      
         idpers wave
      1:      1 2008
      2:      1 2009
      3:      1 2012
      4:      2 2008
      5:      2 2011
      6:      4 2008
      7:      4 2009
      8:      4 2010
      

      数据

      df.short <-  data.frame(
        idpers = c(1,1,1,2,2,3,3,3,3,4,4,4,5),
        wave = c(2008,2009,2012,2008,2011,2005,2006,2007,2008,2008,2009,2010,2011)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        相关资源
        最近更新 更多