

使用するデータは多少簡略化していますが、以下のようなものです。

name year ...  
A社 1999 ...  
A社 2000 ...  
A社 2001 ...  
A社 2002 ...  
B社 1999 ...  
B社 2000 ...  
C社 2001 ...  
C社 2002 ...  
D社 1999 ...  
D社 2000 ...  
D社 2001 ...  
E社 2002 ...

この中から1999年∼2001年のデータが'全て'揃っている企業のみを新しいデータフレームに保存したいです。目標は以下の形になります。  
name year ...  
A社 1999 ...  
A社 2000 ...  
A社 2001 ...  
D社 1999 ...  
D社 2000 ...  
D社 2001 ...


CC BY-SA 4.0
2021-11-06T22:16:03.447
83458
2021-11-08T18:17:23.433
48973
question
r
完全パネルデータの作成にあたり、観測期間(年次データ)のすべてが揃った個体のデータのみを、新しいデータフレームに保存したいです


**標準関数**

[code]

    dfx <- do.call('rbind',
      c(by(df, df$name, function(x) {
          f <- x$year %in% 1999:2001
          if (sum(f)==3) x[f,]
        }), make.row.names=F))
    
    print(dfx)
    #
      name year
    1  A社 1999
    2  A社 2000
    3  A社 2001
    5  D社 1999
    6  D社 2000
    7  D社 2001
    
[/code]

**dplyr**

[code]

    library(dplyr)
    
    dfx <-
      df %>%
      group_by(name) %>%
      filter({f=year %in% 1999:2001;sum(f)==3&f})
    
    print(dfx)
    #
    # A tibble: 6 x 2
    # Groups:   name [2]
      name   year
      <chr> <dbl>
    1 A社    1999
    2 A社    2000
    3 A社    2001
    4 D社    1999
    5 D社    2000
    6 D社    2001
    
[/code]


CC BY-SA 4.0
2021-11-07T01:23:40.500
83464
2021-11-07T01:43:19.537
2021-11-07T01:43:19.537
47127
47127
83458
answer


パネルデータとして扱いたいということなら, たぶん plm パッケージを使っていると思います. よって一般に完全 (バランスド) パネルデータを作成する
`make.pbalanced` を使えば良いと思います. ただし今回は1999-2001年に絞るという特殊な条件も課しているので,
まず年インデックスで絞り込んでから適用することになります.

[code]

    require(plm)
    d <- pdata.frame(d, index = c("name", "year"), row.names = F)
    make.pbalanced(subset(d, year %in% 1999:2001), "shared.individuals")
    
    
[/code]


CC BY-SA 4.0
2021-11-08T18:17:23.433
83494
2021-11-08T18:17:23.433
40575
83458
answer