математически манипулировать конкретными элементами вектора / объекта в R - PullRequest
0 голосов
/ 13 ноября 2018

Мне интересно, как я могу вычесть определенное значение из элементов в векторе, которые превышают установленный мной порог?

например, если мои данные определены как:

numbers = 1:500
data=  sample(numbers)

Теперь у меня есть случайный список чисел от 1 до 500.

Теперь я хочу вычесть 360 из каждого значения в этом векторе, которое больше 200. Логически я хочу написать цикл for с оператором if, чтобы сделать это. Я зашел так далеко, чтобы написать код, который выглядит следующим образом:

for (i in 1:length(data)) {
       if data[i]>200 {
       data[] - 360
     } else {
       data[] - 0
     }
}

Это явно не работает, но я в тупике от того, что я могу сделать, чтобы достичь своей цели. Поскольку впоследствии мне нужно будет построить эти данные, мне нужно, чтобы они оставались в исходном порядке в выходном векторе. Огромное спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Нет необходимости использовать петли.Вот самый простой способ -

data <- data - 360*(data > 200)

Демо -

set.seed(1)
numbers <- 1:500
data <- sample(numbers)

head(data)
# [1] 133 186 286 452 101 445

data <- data - 360*(data > 200)

head(data)
# [1] 133 186 -74  92 101  85
0 голосов
/ 13 ноября 2018

Ну, простой ответ такой:

x[x>200] = x[x>200] - 360
  1. x>200: возвращает логический вектор, в котором каждое значение больше 200 равно TRUE, а другое FALSE
  2. Используйте логический вектор для доступа к элементу вашего исходного вектора. Назначить или получить доступ только к элементу, имеющему значение ИСТИНА в логическом векторе

Ваш код неверный, потому что вы используете неправильный оператор [. Должно выдать ошибку.

for (i in 1:length(data)) { 
    if (data[i]>200) { 
        data[i] = data[i] - 360
    }
}

Это правильный путь. Вы должны прочитать R с самого начала, чтобы лучше понять операторов ...

0 голосов
/ 13 ноября 2018

ifelse() идеально подходит для этой цели, вы можете использовать вектор данных вашего образца:

data <- ifelse( data > 200, data - 360, data )

Просто чтобы придать другой вкус:

set.seed( 1110 )                                      # make it reproducible
data <- sample( numbers )
head( data, 10 )
[1] 242 395 440 287 110  46 241 489 276 178
data[ data > 200 ] <- data[ data > 200 ] - 360        # replace inline
head( data )
[1] -118   35   80  -73  110   46 -119  129  -84  178

Ваш цикл работал бы также после исправления некоторых ошибок, см. Ниже:

for (i in 1:length(data)) {
        if( data[i]>200 ){
        data[ i ] <- data[ i ] - 360}
}
0 голосов
/ 13 ноября 2018

Я бы использовал ifelse

numbers = 1:500
data=  sample(numbers)

new_numbers <- ifelse(numbers >200,numbers-360, numbers)
new_numbers
...