2

列名が 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
...      .   .   .
...      .   .   .

特定の FirmID の最後の 2 行のみを取得する方法

1004  .   .   0
1004  .   .   0
1021  .   .   0
1021  .   .   0
1035  .   .   0
1035  .   .   0
4

3 に答える 3

7

「data.table」パッケージは次のように使用できます (「mydf」という名前で開始すると仮定しますdata.frame)。

> 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

明らかに、「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

そして、ベース R を使用する 1 つの珍しい代替手段:

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

temp[temp$ID %in% c(1, 2), 1:4]
于 2013-03-19T17:54:25.430 に答える
4

あなたのデータが呼ばれていると仮定しますDF

lasttwo <- do.call(rbind,by(DF,DF$FirmID,tail,2))
于 2013-03-19T17:42:15.033 に答える
3

これを行う base-R の方法は、分割 - 適用 - 結合のダンスを手動で行うことです。データの使用:

dat <- read.table(text = "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", header = TRUE)

私達

  1. FirmID:でデータを分割しますsplit(dat, dat$FirmID)。これはリストを返します
  2. lapply以上で、tail最大で最後の 2 行を返す関数を適用すると、この結果は、コンポーネントが からの結果であるリストになりますtail
  3. do.callと を使用してデータ フレームに結合しますrbind

呼び出し全体を 1 行にまとめることができます。

do.call("rbind", lapply(split(dat, dat$FirmID), tail, 2))

与える:

> (out <- do.call("rbind", lapply(split(dat, dat$FirmID), tail, 2)))
       FirmID  LTQ DLCQ DEF
1004.4   1004 0.25 0.67   0
1004.5   1004 0.56 0.34   0
1021.8   1021 0.24 0.76   0
1021.9   1021 0.37 0.56   0
1035     1035 0.89 0.78   0

これらの厄介な行名が気に入らない場合は、削除してください。

> rownames(out) <- NULL
> out
  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
于 2013-03-19T17:44:29.980 に答える