的基-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)
我们
- 各执
FirmID
数据:split(dat, dat$FirmID)
。这将返回一个列表,我们
lapply
结束,应用tail
功能最多的最后两行返回,这样做的结果是,其成分是从tail
结果的列表中,我们则
- 合并回成数据帧使用
do.call
和rbind
。
整个呼叫可以一起串成一条线:
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
因为这些值都是相同的, *为什么它是顶部还是底部2 *?你可以采取'唯一'你的data.frame,然后'rbind'它自己一次... – Arun 2013-03-19 17:33:44
+1 @Arun。提供一个现实的例子,或者你会得到一个解决方案,可能不会满足你的*实际需要。或者,如果这个例子*是现实的,那么Arun就有你的解决方案。 – ndoogan 2013-03-19 17:42:16
谢谢阿伦,好点。我当然有几行,实际上这是我最后两行所需的数据。 – Maximilian 2013-03-19 17:43:13