R 计算向量中的每个值,并将结果聚合到向量

R 计算向量中的每个值,并将结果聚合到向量,r,R,我有一个问题,我需要对向量进行一些操作,对于向量中的每个值,我需要计算这个值的“爬升”值,给定爬升范围L 例如,一个值10位于3位置时,爬升功能将返回[2.5,5],这应该是该值10的爬升值,它们位于1、2位置 我想要得到的结果是一个单向量,它也是一个向量,但是有所有的渐变效果 我用了一些方法成功地得到了正确的结果 因为我需要做很多这样的操作,所以我想知道是否有更快的方法来实现它。(profvis显示此操作是我脚本的瓶颈) 下面是一个简单的例子 x=c(0,0,5,10,10,20,10) L=

我有一个问题,我需要对向量进行一些操作,对于向量中的每个值,我需要计算这个值的“爬升”值,给定爬升范围
L

例如,一个值
10
位于
3
位置时,爬升功能将返回
[2.5,5]
,这应该是该值
10
的爬升值,它们位于
1、2
位置

我想要得到的结果是一个单向量,它也是一个向量,但是有所有的渐变效果

我用了一些方法成功地得到了正确的结果

因为我需要做很多这样的操作,所以我想知道是否有更快的方法来实现它。(profvis显示此操作是我脚本的瓶颈)

下面是一个简单的例子

x=c(0,0,5,10,10,20,10)
L=2
r=矩阵(0,L,长度(x))
对于(1:1中的i)
{
r[i,]=map(x,斜坡,L)%>%
map_dbl(i)%>%
领先(L-i+1,默认值=0)
}
r
[,1]     [,2]     [,3]     [,4]      [,5]     [,6] [,7]
[1,] 1.250000 2.500000 2.500000 5.000000  2.500000 0.000000    0
[2,] 0.000000 2.500000 5.000000 5.000000 10.000000 5.000000    0
结果矩阵
r
的第一行是向右移动后的第一个爬升值,第二行是第二个爬升值

我想要的最后一个返回向量是

colSums(r)
欢迎任何建议,谢谢

为了清楚起见,这里是我使用的
ramp()
函数,半斜坡只是一个易于理解的示例


ramp我想发布我到目前为止为提高流程效率所做的几次尝试

我做的第一件事是优化我的
ramp.all()
步骤,这是我示例中脚本的第二部分

ramp.all.old.1%map\u dbl(i)%%>%领先(L-i+1,默认值=0))
}
报税表(colSums(r))
}
在阅读其他文章时,我注意到,
rbind()
可能不是我的最佳选择。第一次尝试是预先分配结果矩阵
r
,所以我得到了第二个版本

ramp.all.old.2%map\u dbl(i)%%>%lead(L-i+1,默认值=0)
}
报税表(colSums(r))
}
然后,当我仔细查看循环中的代码时,我注意到
map()
实际上有冗余,它只需要在循环之前计算一次。因此,我将map()移出,并用
lappy()
替换它

ramp.all.old.3%map\u dbl(i)%%>%领先(L-i+1,默认值=0)
}
报税表(colSums(r))
}  
类似地,看起来map_dbl()
没有优化,有更好的方法。所以,我推出了第四版

ramp.all.old.4 res.3,ramp.all.old.4(x,2)->res.4,ramp.all(x,2)->res.5)
单位:微秒
expr最小lq平均uq最大neval cld

res.1我想发布我到目前为止为提高流程效率所做的几次尝试

我做的第一件事是优化我的
ramp.all()
步骤,这是我示例中脚本的第二部分

ramp.all.old.1%map\u dbl(i)%%>%领先(L-i+1,默认值=0))
}
报税表(colSums(r))
}
在阅读其他文章时,我注意到,
rbind()
可能不是我的最佳选择。第一次尝试是预先分配结果矩阵
r
,所以我得到了第二个版本

ramp.all.old.2%map\u dbl(i)%%>%lead(L-i+1,默认值=0)
}
报税表(colSums(r))
}
然后,当我仔细查看循环中的代码时,我注意到
map()
实际上有冗余,它只需要在循环之前计算一次。因此,我将map()移出,并用
lappy()
替换它

ramp.all.old.3%map\u dbl(i)%%>%领先(L-i+1,默认值=0)
}
报税表(colSums(r))
}  
类似地,看起来map_dbl()
没有优化,有更好的方法。所以,我推出了第四版

ramp.all.old.4 res.3,ramp.all.old.4(x,2)->res.4,ramp.all(x,2)->res.5)
单位:微秒
expr最小lq平均uq最大neval cld

res.1什么是
斜坡
?代码中没有定义它Hello,akrun,
ramp()
只是一个函数,它用于计算给定值
x
和斜坡长度
L
的斜坡上升值。在我的示例中,
ramp(10,2)
将返回
[2.5,5,10]
。您是说您没有该函数,但根据您的预期结果,需要有人提出它,对吗?好的,让它矢量化或加速
ramp()
可能是加速代码的最佳方式。
profvis
显示了花在
ramp()上的时间与花在其他东西上的时间的对比。如果
ramp
已经矢量化,则加速很容易。若斜坡不可矢量化,那个么加速也很容易。若斜坡不能矢量化,那个么可能并没有太多的工作要做。所以,请分享
ramp
。而且,如果没有
ramp
,我们几乎不可能真正尝试任何东西。什么是
ramp
?代码中没有定义它Hello,akrun,
ramp()
只是一个函数,它用于计算给定值
x
和斜坡长度
L
的斜坡上升值。在我的示例中,
ramp(10,2)
将返回
[2.5,5,10]
。您是说您没有该函数,但根据您的预期结果,需要有人提出它,对吗?好的,让它矢量化或加速
ramp()
可能是加速代码的最佳方式。
profvis
显示了在
ramp()花费的时间
identical(res.1, res.2, res.3, res.4, res.5)
[1] TRUE