我很抱歉问这个愚蠢的问题,我担心答案很明显,但我真的看不到。
想要使用lapply
在矢量列表上应用函数。该函数应该转换向量元素。向量的第一个元素应该保持不变,并且每个下一个元素应该是该元素和前一个元素的总和。我的代码是
trans<-function(x){
if (length(x)==1){
x<<-x
}
else{
x[1]<<-x[1]
for (i in 2:length(x)){
x[i]<<-x[i-1]+x[i]}
}}
问题是,传入的向量在输出中根本不受影响。 但是,如果我写代码如下:
trans<-function(x){
b<<-NULL
if (length(x)==1){
b<<-x
}
else{
b[1]<<-x[1]
for (i in 2:length(x)){
b[i]<<-x[i-1]+x[i]}
}}
比向量b
是传入向量的严格转换。但是因为我想在列表上lapply
这个函数,我需要转换那些向量,而不是创建新的向量。
你可以帮我解决这个问题吗?
示例:传入矢量
a<-c(1,2,3,5)
应转换为:
(1,3,5,8)
第二个功能运作良好,问题是我需要为此创建向量b
。
答案 0 :(得分:1)
比@ digEmAll的评论解决方案快一点的解决方案:
lapply(listOfVectors, function(l) {l + c(0, l[-length(l)])}
x <- list(rnorm(1000), rnorm(1000))
library(microbenchmark)
microbenchmark(digem= lapply(x, function(l) {l + c(0, head(l,-1))}),
alex= lapply(x, function(l) {l + c(0, l[-length(l)])}))
Unit: microseconds
expr min lq mean median uq max neval cld
digem 61.581 68.4235 87.16445 82.679 100.9255 139.508 100 a
alex 33.452 38.0135 64.86589 40.674 57.7800 1739.105 100 a