【问题标题】:How can I clean a panel dataset in R such that only the entries with one or more than two consecutive years are selected?如何清理 R 中的面板数据集,以便仅选择连续一年或两年以上的条目?
【发布时间】:2022-01-25 03:33:34
【问题描述】:

对于一个小型研究项目,我必须使用一个包含多个国家和多年的基尼系数的大型面板数据集。然而,数据并不总是每年收集一次,而且经常会出现一个国家只有几个数据点可用的情况。

我的目标是只选择那些连续两年或更长时间可用的国家/地区。

例如: 答:2008 10 2012 10.7 2015 年 12 月

应该从数据集中删除,但是,我想保留以下实体:

乙:2001 5 2002 5.6 2003 7 2009 8.6

我尝试了以下代码:

df_new <- ddply(df, "country", function(x) {
  cons_idx <- which(diff(x$year) == 1)
  cons_idx <- sort(unique(c(cons_idx, cons_idx + 1)))
  x[cons_idx, ]
})

基于 stakoverflow 1 上发布的类似问题

虽然这段代码确实(正确地)丢弃了 A,但它也从 B 中丢弃了 2009。 因此,它返回: 乙:2001 5 2002 5.6 2003 7

但是,我确实希望包括 2009 年,只是应该丢弃没有连续两年的实体。

我的直觉是我必须使用某种 if-else 语句,但我真的被卡住了。任何帮助将不胜感激!

【问题讨论】:

    标签: r data-cleaning panel-data longitudinal


    【解决方案1】:

    使用ave,您可以按国家/地区分组并测试any 年份differences 是否等于==1。由于ave 不幸将结果强制为数字,我们坚持as.logical,并在括号内对数据框进行子集化。

    df[with(df, as.logical(ave(year, country, FUN=\(x) any(c(0, diff(x)) == 1)))), ]
    #   country year value
    # 4       B 2001   5.0
    # 5       B 2002   5.6
    # 6       B 2003   7.0
    # 7       B 2009   8.6
    

    数据:

    df <- structure(list(country = c("A", "A", "A", "B", "B", "B", "B"), 
        year = c(2008, 2012, 2015, 2001, 2002, 2003, 2009), value = c(10, 
        10.7, 12, 5, 5.6, 7, 8.6)), class = "data.frame", row.names = c(NA, 
    -7L))
    

    【讨论】:

      【解决方案2】:

      这是tidyverse 方法。对于每个国家/地区,检查任何 1 年的差异。如果此评估属实,这将保留该国家/地区的所有数据。

      df <- data.frame(
        country = c("A", "A", "A", "B", "B", "B", "B"),
        year = c(2008, 2012, 2015, 2001, 2002, 2003, 2009),
        value = c(10, 10.7, 12, 5, 5.6, 7, 8.6)
      )
      
      library(tidyverse)
      
      df %>%
        group_by(country) %>%
        filter(any(diff(year) == 1))
      

      输出

        country  year value
        <chr>   <dbl> <dbl>
      1 B        2001   5  
      2 B        2002   5.6
      3 B        2003   7  
      4 B        2009   8.6
      

      【讨论】:

      • 非常感谢!有用!我真的不擅长 tidyverse,有什么技巧可以提高这些技能吗?
      • 有很多很好的来源 - 查看this list。用于数据科学的 R 很好。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多