【问题标题】:How to delete observations based on changes in specific variable?如何根据特定变量的变化删除观察结果?
【发布时间】:2023-03-08 07:48:01
【问题描述】:

我有一个平衡的面板数据表,其中包含数千家公司,每个公司都在两年内进行观察(1 和 2)。对于数据清理过程,我需要排除在所谓的时间常数变量中年份之间存在变化的观察结果。

example <- matrix(c(1,1,2,2,3,3,4,4,1,2,1,2,1,2,1,2,1,1,0,0,0,1,1,0), ncol=3)
colnames(example) <- c('id', 'year', 'supposedly time-constant')
example.table <- data.table(example)
example.table

   id year supposedly time-constant
1:  1    1                        1
2:  1    2                        1
3:  2    1                        0
4:  2    2                        0
5:  3    1                        0
6:  3    2                        1
7:  4    1                        1
8:  4    2                        0

因此,在上表中,公司 3 和 4 都显示了所谓的时间常数变量的变化,因此需要将它们删除。公司 1 和 2 是我希望拥有的。我需要一个代码/函数来清理我的数据。

我似乎已经达到了我的 R 知识的极限,希望我能在这里找到帮助 - 在此先感谢!

【问题讨论】:

  • 公司 3 和 4 有什么变化?它们应该始终为 1 还是全为 0?
  • 只是岁月之间有变化,不是0变1就是1变0。

标签: r formatting panel data-cleaning rowdeleting


【解决方案1】:

我们可以使用dplyr 并选择只有一个唯一值的组

library(dplyr)
example.table %>%
   group_by(id) %>%
   filter(n_distinct(`supposedly time-constant`) == 1)


#     id  year `supposedly time-constant`
#  <dbl> <dbl>                      <dbl>
#1     1     1                          1
#2     1     2                          1
#3     2     1                          0
#4     2     2                          0

在基本 R 中使用 ave 的逻辑相同

example.table[with(example.table, ave(`supposedly time-constant`, id, 
             FUN = function(x) length(unique(x))) == 1), ]

【讨论】:

  • 在看到您的编辑后删除了我的评论。虽然我认为这是一个不错的选择。
【解决方案2】:

您可以使用 data.table 和链接概念来识别哪些 ID/公司显示了这种变化:

example.table[, .(unq_val = length(unique(`supposedly time-constant`))), by = .(id)][unq_val >= 2, .(id)]

上面这行代码可以分解如下: 1. 对于每个 id(在 'by' 参数中), 2. 创建一个名为 unq_val 的变量,它计算唯一的“假定时间常数”的总数, 3. 然后只为此类变量选择包含值 >= 2 的公司/ID。

代码的输出是:

   id
1:  3
2:  4

这是一个 data.table,然后您可以使用它来过滤掉原始数据中的观察结果。

【讨论】:

    【解决方案3】:

    另一种dplyr 方法all 选择全0 或全1 的所有组。如果你有这么多所谓的时间常数条件,这将是低效的:

        library(dplyr)
        example.table %>% 
           group_by(id) %>% 
           filter(all(`supposedly time-constant`==1) | all(`supposedly time-constant`==0))
        # A tibble: 4 x 3
        # Groups:   id [2]
             id  year `supposedly time-constant`
          <dbl> <dbl>                      <dbl>
        1     1     1                          1
        2     1     2                          1
        3     2     1                          0
        4     2     2                          0
    

    【讨论】:

      【解决方案4】:

      我们可以使用data.table 方法,因为它是data.table。按 'id' 分组,检查 supposedly time-constant 中唯一元素的长度是否等于 1 并将 .SD 子集(data.table 的子集)

      library(data.table)
      example.table[, .SD[uniqueN(`supposedly time-constant`) == 1], by = id]
      #     id year supposedly time-constant
      #1:  1    1                        1
      #2:  1    2                        1
      #3:  2    1                        0
      #4:  2    2                        0
      

      或者更快一点的选择是.I

      example.table[example.table[, .I[uniqueN(`supposedly time-constant`)
                  == 1], by = id]$V1]
      #   id year supposedly time-constant
      #1:  1    1                        1
      #2:  1    2                        1
      #3:  2    1                        0
      #4:  2    2                        0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多