如何根据特定变量的变化删除观察值?
How to delete observations based on changes in specific variable?
我有一个平衡的面板数据 table,其中包含数千家公司,每家公司在两年内都有观察结果(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
因此,在上面的 table 中,公司 3 和 4 都显示了所谓的时间常数变量的变化,因此需要将它们删除。公司 1 和 2 是我想要的。我需要一个 code/function 来清理我的数据。
我似乎已经达到了我的 R 知识的极限,希望我能在这里找到帮助 - 提前致谢!
我们可以使用只有一个唯一值的 dplyr
和 select 组
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), ]
另一种 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
我们可以使用 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
您可以使用 data.table 和链接概念来识别哪个 ID's/firms 显示这样的变化:
example.table[, .(unq_val = length(unique(`supposedly time-constant`))), by = .(id)][unq_val >= 2, .(id)]
上面这行代码可以分解如下:
1. 对于每个 id(在“by”参数中),
2. 创建一个名为 unq_val 的变量,它计算唯一的“假定时间常数”总数,
3. 然后只选择 firms/id 包含这样一个变量的值 >= 2。
代码的输出是:
id
1: 3
2: 4
这是一个 data.table,然后您可以使用它从原始数据中过滤掉观察结果。
我有一个平衡的面板数据 table,其中包含数千家公司,每家公司在两年内都有观察结果(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
因此,在上面的 table 中,公司 3 和 4 都显示了所谓的时间常数变量的变化,因此需要将它们删除。公司 1 和 2 是我想要的。我需要一个 code/function 来清理我的数据。
我似乎已经达到了我的 R 知识的极限,希望我能在这里找到帮助 - 提前致谢!
我们可以使用只有一个唯一值的 dplyr
和 select 组
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), ]
另一种 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
我们可以使用 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
您可以使用 data.table 和链接概念来识别哪个 ID's/firms 显示这样的变化:
example.table[, .(unq_val = length(unique(`supposedly time-constant`))), by = .(id)][unq_val >= 2, .(id)]
上面这行代码可以分解如下: 1. 对于每个 id(在“by”参数中), 2. 创建一个名为 unq_val 的变量,它计算唯一的“假定时间常数”总数, 3. 然后只选择 firms/id 包含这样一个变量的值 >= 2。
代码的输出是:
id
1: 3
2: 4
这是一个 data.table,然后您可以使用它从原始数据中过滤掉观察结果。