Выполнение операции над некоторыми элементами вектора - PullRequest
2 голосов
/ 24 апреля 2019

Я знаю, как «извлечь» некоторые элементы из вектора, удовлетворяющего некоторому заданному условию, например, в R:

x = c(10, 20, 30, 40)
x[x<25]

Результат:

[1] 10 20

Что бы я хотелзаключается в применении операции к некоторым заданным элементам вектора без изменения или потери остальных элементов.Например:

x = c(10, 20, 30, 40)
y = numeric(length(x))  # create a vector with as many zeros as elements in `x`

А теперь я хочу сделать y[i] равным 10 раз x[i], только если x[i]>25, конечно, используя векторизацию.

Ответы [ 3 ]

3 голосов
/ 24 апреля 2019

Это работа для ifelse :

# Your data
x = c(10, 20, 30, 40)

# Multiplying with ten if condition is met else zero
ifelse(x>25, x*10, 0)
[1]  0  0 300 400
2 голосов
/ 24 апреля 2019

Вы можете использовать

(x > 25) * (10 * x)
#[1]   0   0 300 400

Чтобы сломать это

(x > 25) #gives
#[1] FALSE FALSE  TRUE  TRUE

(10 * x)
#[1] 100 200 300 400

Теперь, когда вы умножаете это вместе FALSE оценивается в 0, тогда как TRUE в 1. Таким образом, числа больше 25 умножаются на 10, тогда как меньше чем 25 умножаются на 0.


В качестве альтернативы ifelse мы также можем использовать replace

replace(x * 10, x <= 25, 0)      
#[1]   0   0 300 400 

Бенчмаркинг по длине 1e6 данные

set.seed(1234)
x <- sample(1:50, 1e6, replace = TRUE)

library(microbenchmark)
microbenchmark(mul = (x > 25) * (10 * x), 
               ifelse = ifelse(x>25, x*10, 0), 
               replace = replace(x * 10, x <= 25, 0))


Unit: milliseconds
#   expr       min        lq      mean    median        uq       max neval cld
#    mul  6.654335  12.74489  15.93877  14.22821  15.03979  70.48483   100 a  
# ifelse 89.945089 112.12242 126.15313 120.03759 135.84350 432.44697   100 c
#replace 11.711879  18.30549  27.78782  20.75061  21.96056 395.21573   100 b 


В случае, если мы хотим сохранить x как есть и изменить только на x > 25, мы можем сделать

c(1, 10)[(x > 25) + 1] * x
#[1]  10  20 300 400
1 голос
/ 24 апреля 2019

Я понял, как это сделать.Я полагаю, это очень легко для тех, кто ежедневно работает с R;Я публикую это здесь, на всякий случай, если это кому-нибудь поможет:

x = c(10, 20, 30, 40)
y = numeric(length(x))  # create a vector with as many zeros as elements in `x`
ii = (x>25)  # vector of boolean values
y[ii] = 10*x[ii]  # performs the operation only on/for those elements for which `ii` is true
y

Результат:

[1]   0   0 300 400

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...