Замените элементы в векторе, используя mapply, если выполнены условия - PullRequest
0 голосов
/ 21 июня 2019

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

 v1 <- c(-18,-18,-19,-20,-18,-18,-19)
 v2 <- c(34, 7,   8,   9,  7, 10, 30)

Я хочу сравнить элементы в каждом векторе и, если v1 меньше -v2, заменить его значением v2.Я легко могу определить те, которые необходимо заменить:

 v1 < (-v2)
 [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

Я пытался использовать эту функцию mapply, но получаю следующую ошибку

 v1 <- mapply(function(x) if (x< (-v2)) (-v2) else x, v1) 

 Warning messages:
 1: In if (x < (-v2)) (-v2) else x :
   the condition has length > 1 and only the first element will be used
 2: In if (x < (-v2)) (-v2) else x :
   the condition has length > 1 and only the first element will be used

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

Обновление: я тоже пробовал это, и получил новую ошибку

 v1 <- mapply(function(i) if(v1[i]< (-v2[i]) (-v2[i]) else v1[i], seq_along(v1))
 Error: unexpected 'else' in "v1 <- sapply(function(i) if(v1[i]< (-v2[i]) (-v2[i]) else"

Ответы [ 2 ]

1 голос
/ 24 июня 2019

В mapply вы можете применить функцию к нескольким аргументам.В вашем случае ваша функция должна принимать две переменные, такие как:

v1 <- mapply(function(x,y) if (x < (-y)) (-y) else x, v1, v2)
v1
#[1] -18  -7  -8  -9  -7 -10 -19

Как писал Града Гукович , цикл не требуется.В ответе отсутствует только -:

v1[v1 < (-v2)] <- -v2[v1 < (-v2)]
v1
#[1] -18  -7  -8  -9  -7 -10 -19
1 голос
/ 23 июня 2019

Вам не нужен цикл для этого. Это делает работу:

v1 [v1 <(-v2)] <- v2 [v1 <(-v2)]. </p>

Примечание: Вы должны убедиться, что длина двух векторов равна, иначе R будет молчаливо удлинять более короткий при сравнении v1 <(-v2), а подмножество даст бессмысленный результат. </p>

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