Используйте значения из одного вектора для изменения значений в другом векторе R (для l oop) - PullRequest
1 голос
/ 25 марта 2020

Мне нужно изменить определенные значения в одном векторе в зависимости от того, какие значения находятся в тех же местах в другом векторе. Ниже приведены мои векторы:

r <- (1:20)
a <- c(54,54,54,54,55,55,50,0,0,0,0,0,0,1,1,1,1,1,56,57)

В основном, если любое из значений в 'a' больше или равно и меньше 20 (поэтому любое значение в a, равное 0-20), я хочу изменить это значение в 'r' само по себе -1. Если значение в 'a' больше 20 или меньше 0, тогда я хочу, чтобы его значение в 'r' оставалось неизменным. Таким образом, для 8-го места в «а» значение равно 0, которое больше / равно 0 и меньше 20, поэтому я хочу, чтобы восьмое место в «r» (имеет значение 8) вычесть на 1 (так что теперь его значение будет 7). Но для первой точки в «а» значение равно 54, что больше 20, поэтому 1-е значение в r останется прежним. Я предположил, что мне нужно написать для l oop для этого, и я начал, но он не делает то, что мне нужно сделать. Это то, что у меня есть.

for(i in a){
  if (i >= 0 && i < 20){
    r[i] = r[i]-1
  } else {
    r[i] = r[i]
  }
}

Когда я запускаю этот код, он возвращает r как

[1] -4  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 NA NA NA NA NA NA NA NA NA NA NA
[32] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

Как я могу получить его, чтобы он возвращал правильный результат, который должен выглядеть следующим образом :

[1] 1 2 3 4 5 6 7 7 8 9 10 11 12 13 14 15 16 17 19 20

Спасибо!

Ответы [ 4 ]

3 голосов
/ 25 марта 2020

Может быть, это поможет,

r <- (1:20)
a <- c(54,54,54,54,55,55,50,0,0,0,0,0,0,1,1,1,1,1,56,57)

r[a >= 0 & a < 20] <- r[a >= 0 & a < 20] - 1

# [1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20

Вам не нужно все oop здесь приведенный выше ответ является наиболее эффективным.

2 голосов
/ 25 марта 2020

Мы можем l oop через последовательность

for(i in seq_along(a)) if(a[i] >=0 && a[i] < 20) r[i] <- r[i] -1 
r
#[1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20

вместо значений 'a', потому что r[54] не существует и присваивание этому элементу приводит к NA

1 голос
/ 25 марта 2020

Вы можете сделать:

r - (a >= 0 & a < 20) 

[1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20
1 голос
/ 25 марта 2020

Я полагаю, что компактное решение Base R должно использовать ifelse

ifelse(a>=0 & a< 20,r-1,r)

, что дает

> ifelse(a>=0 & a< 20,r-1,r)
 [1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...