我有一个DF喜欢跟随1996年到2016年的不同公司的时间段:
year firms
----------
1996 a
1996 b
1996 c
.......
2016 c
我的问题是如何选择1996年至2016年整个时期的公司?换句话说,我想从不平衡面板设置平衡面板?
到目前为止,我能做的唯一方法就是:
Reduce(intersect, list(a,b,c))
如果我根据这些年份将公司提取到多个向量中。但它显然太挑剔了。
答案 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")