获取每个组中的最后2行

Max*_*ian 2 r dataframe

我有一个数据框,包含列名为FirmID和DEF的数据行.列DEF仅包含零.FirmID列包含公司ID.我想对给定的FirmID进行最后2次观察.DEF列仅为零.

FirmID LTQ DLCQ DEF
1004   0.45 0.21 0 
1004   0.32 0.43 0
1004   0.36 0.47 0
1004   0.25 0.67 0
1004   0.56 0.34 0
1021   0.12 0.39 0
1021   0.16 0.31 0
1021   0.24 0.76 0
1021   0.37 0.56 0
1035   0.89 0.78 0
...      .   .   .
...      .   .   .
Run Code Online (Sandbox Code Playgroud)

那么如何获得给定FirmID的最后2行

1004  .   .   0
1004  .   .   0
1021  .   .   0
1021  .   .   0
1035  .   .   0
1035  .   .   0
Run Code Online (Sandbox Code Playgroud)

A5C*_*2T1 7

您可以使用"data.table"包,如下所示(假设您从data.frame命名为"mydf"开始):

> library(data.table)
> DT <- data.table(mydf, key="FirmID")
> DT[, tail(.SD, 2), by = key(DT)]
   FirmID  LTQ DLCQ DEF
1:   1004 0.25 0.67   0
2:   1004 0.56 0.34   0
3:   1021 0.24 0.76   0
4:   1021 0.37 0.56   0
5:   1035 0.89 0.78   0
Run Code Online (Sandbox Code Playgroud)

显然,将"2"更改为您实际想要的行数(问题的标题和文本中存在矛盾).


另一种选择是以plyr类似的方式使用:

> library(plyr)
> ddply(mydf, .(FirmID), tail, 2)
  FirmID  LTQ DLCQ DEF
1   1004 0.25 0.67   0
2   1004 0.56 0.34   0
3   1021 0.24 0.76   0
4   1021 0.37 0.56   0
5   1035 0.89 0.78   0
Run Code Online (Sandbox Code Playgroud)

并且,使用基数R的一个不寻常的替代

temp <- within(mydf, {
  ID <- ave(FirmID, FirmID, FUN = function(x) rev(seq_along(x)))
})

temp[temp$ID %in% c(1, 2), 1:4]
Run Code Online (Sandbox Code Playgroud)