如何在多年内找到共同元素? (在一段时间内选择相同的实体)

时间:2017-06-03 05:47:28

标签: r

我有一个DF喜欢跟随1996年到2016年的不同公司的时间段:

year firms
----------
1996  a
1996  b
1996  c
.......
2016  c

我的问题是如何选择1996年至2016年整个时期的公司?换句话说,我想从不平衡面板设置平衡面板?

到目前为止,我能做的唯一方法就是:

Reduce(intersect, list(a,b,c))

如果我根据这些年份将公司提取到多个向量中。但它显然太挑剔了。

2 个答案:

答案 0 :(得分:0)

以下代码首先找到所有年份都有数据条目的公司名称,然后将数据分组

library(data.table)
#generate sample data
set.seed(1)
dt <- data.table(year = sample(1996:2016, 500, TRUE), 
                 firms = sample(letters[1:10], 500, TRUE))
dt <- dt[!duplicated(dt)][order(year, firms)]
print(dt)

# find the common element
common_element <- dt[, length(unique(year)) == length(1996:2016), by = firms][V1 == TRUE, firms]
print(common_element)

## [1] "a" "j"

# subset the data
dt_subset <- dt[firms %in% common_element]

答案 1 :(得分:0)

您可以使用表格并匹配具有相同年份长度的相同长度的元素,即

table(df$firm)

#a b c 
#5 3 3

table(df$firm) == length(unique(df$year))

#    a     b     c 
# TRUE FALSE FALSE 

t1 <- table(df$firm) == length(unique(df$year))
names(t1)[t1]

#[1] "a"

df[df$firm %in% names(t1)[t1],]

#   year firm
#1  1996    a
#4  1997    a
#7  1998    a
#10 1999    a
#13 2000    a

数据

dput(df)
structure(list(year = c(1996L, 1996L, 1996L, 1997L, 1997L, 1998L, 
1998L, 1999L, 2000L, 2000L, 2000L), firm = c("a", "b", "c", "a", 
"b", "a", "c", "a", "a", "b", "c")), .Names = c("year", "firm"
), row.names = c(1L, 2L, 3L, 4L, 5L, 7L, 8L, 10L, 13L, 14L, 15L
), class = "data.frame")