2014-02-04 2 views
0

Я пытаюсь создать набор новых векторов на основе правила для списка векторов. Мой вход состоит из 3 нормальных векторов (index, rfree, ret) и список из нескольких векторов (roll), причем все векторы имеют одинаковую длину. Я хочу, чтобы новые векторы следовали правилу: если index> roll -> ret, else rfree, чтобы индекс оценивался против числа «k» векторов валиков, дающих «k» новые векторы, которые состоят только из входов ret и rfree , Моя текущая программа не работает, и я не могу понять, почему. Сообщение об ошибке, которое я получаю, этоDouble for-loop не работает

"Error in `*tmp*`[[j]] : subscript out of bounds" 

Но я не могу понять, почему. Любая помощь приветствуется.

#Input: 
roll <- list(runif(85),runif(85)) 
index <- runif(85) 
rfree <- rnorm(85) 
ret <- rnorm(85) 

#Programe: 
aret <- function(index, roll, ret, rfree, k=2){ 
    aret <- list() 
    for (j in seq(k)) 
    for (i in 1:length(ret)){ 
     if (roll[[j]][i]>index[i])(aret[[j]][i] <- ret[i]) 
     else(aret[[j]][i] <- rfree[i]) 
    } 
} 
+3

'к = k' ничего не делает здесь , И, чтобы полностью ответить на ваш вопрос, нам нужно будет увидеть некоторые ваши данные. В частности, 'index,' roll', 'ret' и' rfree'. Я предполагаю, что происходит то, что 'k' длиннее, чем' ist' или 'roll', поэтому вы видите ошибку ... используйте что-то вроде' dput', чтобы включить ваши данные и потратить некоторое время на [прочитать о воспроизводимых примерах] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Justin

+0

Было бы неплохо, если бы вы представили несколько примеров ваших векторов, чтобы мы могли более четко понять вас , Например, используйте 'dput (roll)', чтобы мы могли просто вырезать и вставить его в наши браузеры. – nograpes

+0

Хорошо, мне нужно будет вернуться, как только я прочитаю о dput. Извините за непонятный вопрос. – user3248544

ответ

1

Это должно сделать это, но я согласен с @Carl, матрица будет легче манипулировать здесь, если все векторы имеют одинаковую длину

roll <- matrix(runif(170),ncol=2) #lets use a matrix instead 
index <- runif(85) #index is your indicator variable when compared to roll 
rfree <- rnorm(85) #assign if roll>index 
ret <- rnorm(85) #assign if index>roll 

#use vector operations when possible, for speed and readability. Look into 
#sapply, lapply etc. Apply is useful for column/row operations in matrices 
result<-apply(roll,2, function(x){ 
    # we will use an anonymous function here for this, 
    #but you could define elsewhere if needed 
    w<-index>x # where is index larger than our roll entries 
    x[w]<-ret[w] #assign the corresponding ret there 
    x[!w]<-rfree[!w] #assign the corresponding rfree where appropriate 
    x 
}) 
+0

Спасибо большое, это очень ценится! Как вы, вероятно, полагали, что я новичок в R и все еще пытаюсь найти «логичный» способ решения проблемы. Я обязательно постараюсь прочитать приведенные подсказки :) – user3248544

+0

Нет проблем. Я тоже не так опытен в R, но надеюсь узнать больше об этом и поделиться тем, что мало я узнал. То, что я нашел в случае с множеством языков на основе массивов (думаю, Matlab, R, Numpy и т. Д.): Избегать циклов. Эти языки обычно имеют конструкции, более похожие на функциональные карты (http://en.wikipedia.org/wiki/Map_(higher-order_function), которые являются a) более читабельными и b) (обычно) быстрее – JPC

Смежные вопросы