firm year rating
A 2010 1
A 2011 1
A 2012 1
B 2010 1
B 2011 1
C 2010 1
C 2011 2
C 2012 2
我希望子集公司满足以下条件。
公司在整个期间都不会改变评级,因此公司C不满意,因为它将评级从1改为2.
每家公司在2011年之前和之后都至少包含一次观察,因此公司B不满意,因为它在2011年之后没有观察到。
答案 0 :(得分:3)
使用data.table
:
# load the 'data.table' package
library(data.table)
# convert your dataframe to a data.table
setDT(df)
# filter
df[, if(any(year < 2011) & any(year > 2011) & uniqueN(rating) == 1) .SD, by = firm]
给出:
firm year rating 1: A 2010 1 2: A 2011 1 3: A 2012 1
dplyr
中实现了同样的想法:
library(dplyr)
df %>%
group_by(firm) %>%
filter(any(year < 2011) & any(year > 2011) & n_distinct(rating) == 1)
或在基地R:
i1 <- as.logical(with(df, ave(year, firm, FUN = function(x) any(x < 2011) & any(x > 2011))))
i2 <- as.logical(with(df, ave(rating, firm, FUN = function(x) length(unique(x)) == 1)))
df[i1 & i2, ]