【问题标题】:Filtering a panel dataset in r在 r 中过滤面板数据集
【发布时间】:2019-02-12 18:19:27
【问题描述】:

我有一个这种形式的数据框

familyid memberid occupation panelid year
1        1        1          1       2000
1        2        1          1       2000
2        1        1          1       2000 
2        2        2          1       2000
3        1        1          1       2000
3        2        1          1       2000
3        3        1          1       2000
1        1        2          2       2001
1        2        1          2       2001
2        1        2          2       2001
2        2        2          2       2001
3        1        1          2       2001
3        2        2          2       2001
3        3        2          2       2001

我想过滤此数据框以获得以下内容。

familyid memberid occupation panelid year
1        1        1          1       2000
2        1        1          1       2000 
3        2        1          1       2000
3        3        1          1       2000
1        1        2          2       2001
2        1        2          2       2001
3        2        2          2       2001
3        3        2          2       2001

换句话说,我只想保留在 2000 年 (panelid==1) 显示职业==1 和在 2001 年显示职业==2 (panelid==2) 的面板 obs。有人知道怎么做这个吗?非常感谢大家,

马可

【问题讨论】:

  • 试试subset(df1, (occupation == 1 & year == 2000) | (occupation == 2 & year == 2001))
  • 请注意,在输入中有 6 个观察值,其中 occuopation 为 1,year 为 2000。因此,不清楚某些行是如何在预期中被删除的
  • 不确定panelid是否与occpuation相同是巧合,还是您更喜欢year而不是panelid,但您也可以使用subset(df1, panelid == occpuation)跨度>
  • @akrun 这是因为我只想保留从 2000 年职业 1 转移到 2001 年职业 2 的家庭成员。如果一个家庭成员在 2000 年和 2001 年都拥有职业 1,我希望它被删除。

标签: r


【解决方案1】:

在这里,我们可以根据 any 'occupation' 1 和 'year' 2000 以及 any 'occupation' 2 和 'year' 2001 按 'familyid'、'memberid'、filter 分组

library(tidyverse)
df1 %>% 
  group_by(familyid, memberid) %>% 
  filter(any(occupation == 1 & year == 2000) & any(occupation == 2 & year == 2001))
# A tibble: 8 x 5
# Groups:   familyid, memberid [4]
#  familyid memberid occupation panelid  year
#     <int>    <int>      <int>   <int> <int>
#1        1        1          1       1  2000
#2        2        1          1       1  2000
#3        3        2          1       1  2000
#4        3        3          1       1  2000
#5        1        1          2       2  2001
#6        2        1          2       2  2001
#7        3        2          2       2  2001
#8        3        3          2       2  2001

或者如果'职业'和'年份'的级别只有两个,那么我们也可以用n_distinct来计算filtering的逻辑向量

df1 %>% 
  group_by(familyid, memberid) %>%
  filter(n_distinct(occupation) >1 & n_distinct(year)> 1)

数据

df1 <- structure(list(familyid = c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 
2L, 2L, 3L, 3L, 3L), memberid = c(1L, 2L, 1L, 2L, 1L, 2L, 3L, 
1L, 2L, 1L, 2L, 1L, 2L, 3L), occupation = c(1L, 1L, 1L, 2L, 1L, 
1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L), panelid = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), year = c(2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L)), class = "data.frame", row.names = c(NA, 
-14L))

【讨论】:

  • 非常感谢阿克伦!
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 2020-12-22
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2010-10-03
  • 2015-03-09
相关资源
最近更新 更多