R/Stata: 删除没有数据的人

R/Stata: Remove persons without data

我有一个数据项目,我的面板集有问题。

我想删除 "persons" 没有关于变量 "car" 的数据 在我的例子中,我应该删除第 3 个人,但是拥有一些关于汽车数据的第 1 个人应该留在集合中

用 R/plyr 和 Stata 尝试过,但似乎没有任何效果。 数据集有 400,000 行 btw

数据示例:

person_id  year  car 
1   2000    1   
1   2001    nA  
1   2002    1   
1   2003    nA  
2   1998    1   
2   1999    0   
2   2000    0   
3   2003    nA  
3   2004    nA  

使用 library(dplyr),较新版本的 library(plyr)

datf <- read.table(text = "person_id  year  car 
1   2000    1   
                   1   2001    nA  
                   1   2002    1   
                   1   2003    nA  
                   2   1998    1   
                   2   1999    0   
                   2   2000    0   
                   3   2003    nA  
                   3   2004    nA", header = TRUE)

# adjust to true NA values for R
datf$car <- gsub("nA", NA, datf$car)

# To keep only the people that don't have all NA values for car
library(dplyr)

datf %>% group_by(person_id) %>%
    filter(!all(is.na(car)))

# result
      person_id  year   car
      <int> <int> <chr>
1         1  2000     1
2         1  2001  <NA>
3         1  2002     1
4         1  2003  <NA>
5         2  1998     1
6         2  1999     0
7         2  2000     0

在 Stata 中,假设您已将 car 转换为具有 Stata 数值缺失值的数值变量,而您现在拥有 nA。

. by person_id (year), sort: egen tokeep = count(car)

. list, clean noobs

    person~d   year   car   tokeep  
           1   2000     1        2  
           1   2001     .        2  
           1   2002     1        2  
           1   2003     .        2  
           2   1998     1        3  
           2   1999     0        3  
           2   2000     0        3  
           3   2003     .        0  
           3   2004     .        0  

. drop if tokeep==0
(2 observations deleted)

. drop tokeep

. list, clean noobs

    person~d   year   car  
           1   2000     1  
           1   2001     .  
           1   2002     1  
           1   2003     .  
           2   1998     1  
           2   1999     0  
           2   2000     0  

如果您坚持为 car

保留当前基于字符串的编码
by person_id (year), sort: egen tokeep = sum(cond(car=="nA",0,1))

应该可以解决问题,虽然我没有测试。