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