使用lapply()在R中使用值列表进行筛选太慢了

问题描述 投票:0回答:1

我有一个唯一的股票名称列表(大约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()函数时,都需要重新执行。

如果有人能提出更好/更快的方法来解决此问题,将不胜感激。

r optimization apply lapply
1个回答
0
投票

因为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]
© www.soinside.com 2019 - 2024. All rights reserved.