如何根据特定变量的变化删除观察结果?

时间:2019-05-01 13:28:12

标签: r formatting panel data-cleaning rowdeleting

我有一个平衡的面板数据表,其中包含成千上万的公司,每个公司在两年内都有观察结果(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知识的极限,希望我能在这里找到帮助-预先感谢!

4 个答案:

答案 0 :(得分:3)

我们可以使用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

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

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

答案 1 :(得分:2)

您可以使用data.table和chaining概念来识别哪些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,您可以将其用于从原始数据中过滤出观察结果。

答案 2 :(得分:1)

另一种dplyr的{​​{1}}方法选择所有具有全0或全1的组。如果您有许多据称时间恒定的条件,则效率会很低:

all

答案 3 :(得分:1)

我们可以使用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