假设我有一个这样的数据框:
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
请告诉我该怎么做。感谢
答案 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