2015-11-02 2 views
2

Прошу прощения за этот глупый вопрос, я боюсь, что ответ очевиден, но я действительно не могу его увидеть.Преобразование вектора в вектор с таким же именем в R

A want to применить функцию в списке векторов, используя 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 является Rigth преобразование входящего вектора. Но поскольку я хочу lapply эту функцию в списке, мне нужно просто преобразовать эти векторы, а не создавать новые.

Можете ли вы помочь мне исправить это?

пример: входящий вектор

a<-c(1,2,3,5) 

должны быть преобразованы в:

(1,3,5,8) 

Вторая функция работает хорошо, проблема заключается в том, что мне нужно создать вектор b для этого.

+0

Что-то вроде 'lapply (listOfVectors, cumsum)'? – digEmAll

+0

Нет, 'cumsum()' суммировать все предыдущие элементы. Я хочу суммировать только i-й элемент с i-1-м элементом. – Bobesh

+2

Итак, 'lapply (listOfVectors, function (v) {v + c (0, head (v, -1))})'? – digEmAll

ответ

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 
+0

Вы правы. У меня опечатка. Я обновлю –