将矢量转换为R中具有相同名称的矢量

时间:2015-11-02 22:04:20

标签: r function vector

我很抱歉问这个愚蠢的问题,我担心答案很明显,但我真的看不到。

想要使用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

1 个答案:

答案 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