【问题标题】:R/Stata: Remove persons without dataR/Stata:删除没有数据的人
【发布时间】:2017-11-18 15:49:35
【问题描述】:

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

我想删除没有关于变量“汽车”的数据的“人” 在我的示例中,我应该删除第 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  

【问题讨论】:

    标签: r stata data-science


    【解决方案1】:

    使用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
    

    【讨论】:

    • 非常感谢
      dplyr 好像是个很强大的库,能推荐一个好的介绍吗?
    • dplyr cheatsheet 很棒,R for DataScience 这本书非常棒,可以提供更多深度
    • 感谢资源
      ..但是可以说 NA 是一个像“2”这样的数字.. 这是正确的
      filter(!any(car=="2" )) ?
    • 也尝试了 any... 但 is.na 过滤器和 any 过滤器之间的观察次数不同
    • 因此,如果您将“nA”条目转换为“2”,这是否有效filter(!all(car == 2))
    【解决方案2】:

    在 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))
    

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

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2021-04-15
      相关资源
      最近更新 更多