我有一个数据框,包含列名为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)
您可以使用"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)