如何从 R 中的面板数据框中删除具有唯一 ID 的行?
How to delete rows with a unique ID from a panel data frame in R?
我有一个数据 table 包含数千家可以通过唯一 ID 识别的公司。它是长格式数据,每个公司应该在不同年份出现两次(两年内的横截面时间序列)。
但是,并非所有公司都出现在这两年中,我正在尝试创建一个平衡的长格式面板,其中只保留出现在这两年中的公司。我该如何实现?
这是一个示例数据 table 来说明问题:
example <- matrix(c(1,1,2,3,3,2013,2016,2013,2013,2016), ncol=2)
colnames(example) <- c('id', 'year')
example.table <- data.table(example)
example.table
id year
1: 1 2013
2: 1 2016
3: 2 2013
4: 3 2013
5: 3 2016
在示例中,我需要一个 code/function 来排除 ID 为“2”的公司行,因为它在 2016 年没有匹配项。
换句话说:我需要一个 code/function 将每一行与前一行和后一行进行比较并排除它,如果在 id 列中没有匹配项。
我已经投入了很多时间,但似乎已经达到了我的 R 知识的极限,非常感谢任何支持。谢谢!
我们从整个数据集创建一个 unique
'year' 的向量,然后检查 all
'nm1' 中的值是否 %in%
'year' 按 'id' 分组并子集 data.table
un1 <- unique(example.table$year)
example.table[, .SD[all(un1 %in% year)], id]
# id year
#1: 1 2013
#2: 1 2016
#3: 3 2013
#4: 3 2016
注意:OP的数据集是data.table
,这里使用的方法是data.table
。最初,考虑过使用 .SD[uniqueN(year) > 1]
,但这是错误的,可能不适用于所有情况
使用 dplyr
如下:
library(dplyr)
example.table %>%
group_by(id) %>%
filter(n() > 1)
# A tibble: 4 x 2
# Groups: id [2]
id year
<dbl> <dbl>
1 1 2013
2 1 2016
3 3 2013
4 3 2016
data.table
等效于@Sonny 的dplyr
解决方案
example.table[, if(.N > 1) .SD, id]
id year
1: 1 2013
2: 1 2016
3: 3 2013
4: 3 2016
我有一个数据 table 包含数千家可以通过唯一 ID 识别的公司。它是长格式数据,每个公司应该在不同年份出现两次(两年内的横截面时间序列)。
但是,并非所有公司都出现在这两年中,我正在尝试创建一个平衡的长格式面板,其中只保留出现在这两年中的公司。我该如何实现?
这是一个示例数据 table 来说明问题:
example <- matrix(c(1,1,2,3,3,2013,2016,2013,2013,2016), ncol=2)
colnames(example) <- c('id', 'year')
example.table <- data.table(example)
example.table
id year
1: 1 2013
2: 1 2016
3: 2 2013
4: 3 2013
5: 3 2016
在示例中,我需要一个 code/function 来排除 ID 为“2”的公司行,因为它在 2016 年没有匹配项。 换句话说:我需要一个 code/function 将每一行与前一行和后一行进行比较并排除它,如果在 id 列中没有匹配项。
我已经投入了很多时间,但似乎已经达到了我的 R 知识的极限,非常感谢任何支持。谢谢!
我们从整个数据集创建一个 unique
'year' 的向量,然后检查 all
'nm1' 中的值是否 %in%
'year' 按 'id' 分组并子集 data.table
un1 <- unique(example.table$year)
example.table[, .SD[all(un1 %in% year)], id]
# id year
#1: 1 2013
#2: 1 2016
#3: 3 2013
#4: 3 2016
注意:OP的数据集是data.table
,这里使用的方法是data.table
。最初,考虑过使用 .SD[uniqueN(year) > 1]
,但这是错误的,可能不适用于所有情况
使用 dplyr
如下:
library(dplyr)
example.table %>%
group_by(id) %>%
filter(n() > 1)
# A tibble: 4 x 2
# Groups: id [2]
id year
<dbl> <dbl>
1 1 2013
2 1 2016
3 3 2013
4 3 2016
data.table
等效于@Sonny 的dplyr
解决方案
example.table[, if(.N > 1) .SD, id]
id year
1: 1 2013
2: 1 2016
3: 3 2013
4: 3 2016