Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中的值列表和lappy()进行筛选太慢_R_Optimization_Apply_Lapply - Fatal编程技术网

使用R中的值列表和lappy()进行筛选太慢

使用R中的值列表和lappy()进行筛选太慢,r,optimization,apply,lapply,R,Optimization,Apply,Lapply,我有一个独特的股票名称列表(大约12k只股票),上面有“以前的最高收入”和一个相当大的数据框。数据框包含股票名称、收入、收入年份。例如: AAPL | 2000 | 1,000 AAPL | 2001 | 1,200 AAPL | 2002 | 900 AMZN | 2000 | 300 AMZN | 2001 | 500 MSFT | 2000 | 600 我需要从大数据框中查看一只股票在哪一年超过了它的“前最大收入”。由于每家公司报告的收入年份不同,有些公司有2000-2002年的数据,有

我有一个独特的股票名称列表(大约12k只股票),上面有“以前的最高收入”和一个相当大的数据框。数据框包含股票名称、收入、收入年份。例如:

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年)

我的方法是筛选股票名称。所以,我必须对每一只股票都这样做。这就是为什么我使用lappy(),但它太慢了

下面是我要说的部分

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))
rec_year pre_max_table[pre_max_table$tic==sym]$ni]$fyear[1]
返回(恢复年份-恢复前最大值表[恢复前最大值表$tic==sym]$fyear)
}

年份覆盖因为
前置最大值表
似乎是一个
数据表
,作为第一步,我要
设置键(前置最大值表,tic)
,以便

  recovery_year <- (post_table %>% filter(tic==sym & ni > pre_max_table[pre_max_table$tic==sym]$ni))$fyear[1]
有没有一种方法不使用lappy()就可以做到这一点(为每个组找到一个特定的值)

与最初的方法不同,这里的方法是首先选择收入较高的所有行,然后从这些行中除去每个股票的第一行以外的所有行:

# pick all rows from post_table with income higher than that from pre_max_table
ps = subset(post_table, ni > pre_max_table[post_table['tic']]$ni)
# pick only the first row for each stock
pnd = ps[!duplicated(ps$tic), c('tic', 'fyear')]
# compute the "recover" time for each stock (including NAs)
YearsRecover = pnd[levels(pnd$tic), 'fyear'] - pre_max_table$fyear

请编辑您的问题,用文字说明代码的作用。另外,
pre_max_表中的内容是什么?请分享一个样品。我怀疑有一种方法可以通过连接更快地完成此操作,但不确定您到底在做什么。嗨,我补充了解释。抱歉造成歧义。您是否已经有了
pre\u max\u表
,或者您已经计算了它?我想你不用那张桌子也能做到。当前共享数据的预期输出是什么?哦,我已经有了pre_max_表。基本上,我需要用post_table计算出每家公司需要多少年的时间才能超过之前的最大值。嗨,谢谢你的回答。但是有没有一种不使用lappy()的方法可以做到这一点(为每个组找到一个特定的值)?我发现多次调用函数会大大降低代码的速度。我不知道是否有一种方法可以在不多次调用函数的情况下做到这一点。只要没有人找到,我们所能做的就是优化函数。
  recovery_year <- post_table[post_table$tic==sym & post_table$ni > pre_max_table[sym]$ni, "fyear"][1]
# pick all rows from post_table with income higher than that from pre_max_table
ps = subset(post_table, ni > pre_max_table[post_table['tic']]$ni)
# pick only the first row for each stock
pnd = ps[!duplicated(ps$tic), c('tic', 'fyear')]
# compute the "recover" time for each stock (including NAs)
YearsRecover = pnd[levels(pnd$tic), 'fyear'] - pre_max_table$fyear