Создание и модификация вектора на основе других векторов - PullRequest
0 голосов
/ 22 ноября 2011

Я хотел бы сделать код более эффективным.

В примере создается вектор (называемый 'new_vector').Значения этого 'new_vector' изменяются в зависимости от условий if / else, которые ссылаются на значения трех других векторов одинаковой длины.

Если условия выполнены, соответствующие элементы 'new_vector' обновляются с использованием значений из одного из других векторов (в примере элементы M_date записываются в new_vector).это пример кода:

new_vector<-c(9,9,9)
S_date<-c(1,1,as.Date('2010/08/01'))
V_date<-c(1,as.Date('2010/09/01'),1)
M_date<-c(2,as.Date('2010/07/01'),1)

for (i in 1:3) {
    if ( (S_date[i]==1) & (V_date[i]==1 | M_date[i] < V_date[i]) ) {
    new_vector[i]<-M_date[i]
    }
}

Результат примера:

> new_vector
[1]     2 14791     9

Пример упрощен, и в действительности векторы больше и существуют дополнительные условия if / else-условия.

Как мне избежать цикла и использовать неявные методы для векторных операций?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Используйте ifelse вместо if:

new_vector<-c(9,9,9)
S_date<-c(1,1,as.Date('2010/08/01'))
V_date<-c(1,as.Date('2010/09/01'),1)
M_date<-c(2,as.Date('2010/07/01'),1)

vec <- ifelse((S_date==1) & (V_date==1 | M_date < V_date), M_date, new_vector)
vec
#[1]     2 14791     9

НТН

2 голосов
/ 22 ноября 2011

Если вы пишете выражение без битов [i], вы получаете вектор True / False результат:

> S_date==1 & (V_date==1 | M_date < V_date)
[1]  TRUE  TRUE FALSE

присваивает его вектору и заменяет в new_vector таким результатом:

> result = S_date==1 & (V_date==1 | M_date < V_date)
> new_vector[result]=M_date[result]
> new_vector
[1]     2 14791     9

Это довольно общая картина.Вычислите логический вектор, затем замените эти совпадающие значения соответствующими значениями из другого вектора.

Это работает, потому что значение FALSE в третьем элементе результата означает, что new_vector[3] не трогается.

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