2015-07-08 4 views
1

Я пытаюсь написать функцию в R, но я борюсь с проблемой последовательности:R: Проблемы создания (SEQ 0,9) в цикле

vincent <- function(v,n, val_min){ 
    # v = vector to vincentize n = number of bin +1 
    mean_vct <- array(0, n) # n = nb de bins; crée un vecteur de 5 zéros si n = 5 
    vsort <- sort(v) 
    vsort <- sort(subset(vsort, vsort>= val_min)) 
    for (j in seq(1,n)){ 
    mean_vct[j] <- (val_inf(j,vsort,n) + val_inter(j,vsort,n) + val_sup(j,vsort,n)) 
    mean_vct[j] <- mean_vct[j]/(length(vsort)/(n)) 
    } 
    return (mean_vct) 
} 

При применении этого кода с печать последовательности, я получаю: 1 2 3 4 5 6 7 8 9 0 вместо 0 1 2 3 4 5 6 7 8 9 И мне нужна эта последовательность, чтобы начать с 0, потому что я преобразование кода из Python к R.

Благодаря

Edit: пример для применения эта функция :

RT <- 1:100 
vincent(RT, 10, 0) 
+2

Индексирование R начинается с 1, а не 0. Это отличается от Python. –

+1

в основном то, что вы делаете в своей функции, просто возвращает «0: 9». Каков ваш желаемый результат? Чего вы пытаетесь достичь? –

+0

Да, я знаю это, и я думал, что смогу преодолеть это, создав последовательность, начинающуюся с 0, Нет ли способа использовать цикл с последовательностью, начинающейся с 0? –

ответ

1

Есть несколько проблем с вашим кодом.

vincent <- function(v,n){ 
    # v = vector to vincentize n = number of bin 
    mean_vct <- array(0, n) 
    vsort <- sort(v) #Tri dans l'ordre les TR 
    for (j in seq(0,9)){ #pour chaque bin 
    mean_vct[j] <- j 
    } 
    return (mean_vct) 
} 

для (J в последовательности (0, 9))

  1. Вы должны пойти к п, а не до 9, используя другой пример приведет к сбою цикла
  2. Есть более простые способы чтобы перейти от 0 до п ->0:n создает последовательность так же, как SEQ (0,9) (вы, вероятно, используется для метода диапазона в Python)

mean_vct [j] < - j

Это не сработает, потому что R начинает индексировать его.

У вас есть несколько вариантов:

  1. Loop от 1: п вместо 0: (п-1) и упаковывают вам нужно J для вашего использования вычислений (J-1) в ваших вычислениях
  2. Loop от 0: (n-1) и используйте mean_vct [j + 1]

С тех пор как я начал писать этот ответ, вы изменили свой код, но это все равно должно объяснить вашу проблему.

+0

Решение (j-1) работает отлично! Большое спасибо ! –

2

Стоит отметить, что array действительно для многомерных массивов. Вы можете инициировать mean_vct, используя mean_vct <- numeric(9).

Основная проблема заключается в том, что вы не можете назначить mean_vct[0], поскольку индексация векторов всегда начинается с 1. Причина, по которой mean_vct[10] содержит 0, состоит в том, что вы инициировали ее с помощью 0. Вы можете использовать индексацию символов, если вы действительно хотите обратитесь к вашему вектору по индексам, начинающимся с 0, но это может ввести в заблуждение.

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

mean_vct <- 0:9 

и при желании:

names(mean_vct) <- 0:9 
+0

Спасибо за ваш ответ, отныне я буду знать об использовании векторизованного кода. –