如何在整个样本期间对样本子集满足条件?

时间:2018-02-02 15:31:38

标签: r

 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

我希望子集公司满足以下条件。

  1. 公司在整个期间都不会改变评级,因此公司C不满意,因为它将评级从1改为2.

  2. 每家公司在2011年之前和之后都至少包含一次观察,因此公司B不满意,因为它在2011年之后没有观察到。

1 个答案:

答案 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, ]