我有一个唯一的股票名称列表(大约1万2千个股票),它们的“先前最大收入”和相当大的数据框。数据框具有股票名称,收入,该收入的年份。例如:
AAPL | 2000 | 1,000
AAPL | 2001 | 1,200
AAPL | 2002 | 900
AMZN | 2000 | 300
AMZN | 2001 | 500
MSFT | 2000 | 600
我需要检查大数据框架中的股票在哪一年超过其“先前的最高收入”。由于每家公司都报告了不同年份的收入,因此有些公司具有2000-2002年的数据,有些公司具有更多的数据(2000-2005年),有些公司的数据较少(2000-2001年)。
我的方法是过滤股票名称。因此,我必须为每只股票执行此操作。这就是为什么我使用lapply(),但是它太慢了。
下面是我正在谈论的部分。
rec_year <- function(sym) {
recovery_year <- (post_table %>% filter(tic==sym & ni > pre_max_table[pre_max_table$tic==sym]$ni))$fyear[1]
return(recovery_year - pre_max_table[pre_max_table$tic==sym]$fyear)
}
YearsRecover <- unlist(lapply(tic_list,rec_year))
ni:净收入tic:股票名称fyear:会计年度
pre_max_table
包含股票列表以及它们之前的最高收入。例如:AAPL | 2001 | 1,200AMZN | 2002 | 900MSFT | 2001 | 1000
post_table
包含新数据以对照pre_max_table
中的先前最大值进行检查
rec_year()
函数首先检查pre_max_table
中先前的最大净收入。然后,它检查股票名称sym
在哪一年超过其前一个最大值。如果找到年份,则返回上一个最高收入年份与sym
超过其自己的记录的年份之间的差额。然后,我使用lapply()
将此rec_year()
应用于tic_list
我认为代码运行缓慢,因为它必须遍历许多tic名称(12k)。每次必须重新运行rec_year()
函数时,都需要重新执行。
如果有人能提出更好/更快的方法来解决此问题,将不胜感激。
因为pre_max_table
似乎是data.table
,所以第一步,我想要setkey(pre_max_table, tic)
,所以
recovery_year <- (post_table %>% filter(tic==sym & ni > pre_max_table[pre_max_table$tic==sym]$ni))$fyear[1]
可以修改为
recovery_year <- (post_table %>% filter(tic==sym & ni > pre_max_table[sym]$ni))$fyear[1]
然后我发现使用filter()
会降低代码的速度,因此我进一步修改为
recovery_year <- post_table[post_table$tic==sym & post_table$ni > pre_max_table[sym]$ni, "fyear"][1]