根据R中列的条件提取数据框中的行

时间:2015-06-23 15:19:16

标签: r

假设我有一个这样的数据框:

port_id           report_dt       market_val
--------          ---------
100               1200            300
100               1200            500
100               1200            270

100               1300            320
100               1300            490
100               1300            310

101               1200            440
101               1200            320

102               1300            420
102               1300            425

每一行都是port_id为每个报告日期指定的投资组合中的股票。一个port_id可以报告一次或多次 例如:port_id = 100报告两次,前三行是3个股票,在port_id = 100,日期为1200.接下来的三行是3个股票,在port_id = 100;但是对于1300日期。 但是,port_id = 102和103仅报告一次。

我想为每个port_id保留所有最近报告的股票,这应该是:

port_id           report_dt       market_val
--------          ---------
100               1300            320
100               1300            490
100               1300            310

101               1200            440
101               1200            320

102               1300            420
102               1300            425

请告诉我该怎么做。感谢

2 个答案:

答案 0 :(得分:0)

这是一种方法:

df[df$report_dt == max(df$report_dt), ]
#  port_id report_dt market_val
#4     100      1300        320
#5     100      1300        490
#6     100      1300       3100

<强>更新 从您更新的编辑。这是一种方式:

splt <- lapply(split(df, df$port_id), function(x) x[x$report_dt == max(x$report_dt),])
newdf <- do.call(rbind, splt)
rownames(newdf) <- NULL
newdf
#   port_id report_dt market_val
# 1     100      1300        320
# 2     100      1300        490
# 3     100      1300       3100
# 4     101      1200        440
# 5     101      1200        320
# 6     102      1300        420
# 7     120      1300        425

注意:我讨厌我必须分裂,应用,结合这么字面。但是SAC功能对我不起作用。如果有人有想法,我很乐意优化。

答案 1 :(得分:0)

这是我的dplyr方法。

library(dplyr)
filter(df, port_id == 100, report_dt == 1300)
  port_id report_dt market_val
1     100      1300        320
2     100      1300        490
3     100      1300       3100