mapply с входами нулевой длины. Как заставить его пропускать? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть 2 отдельных набора данных с характеристиками одних и тех же людей: положение и размер. Положение будет меняться каждый час в зависимости от размера. Размер также будет меняться каждый час, но не в этом представлении. В любом случае, я делаю это в al oop, который выполняет итерацию каждый час с функциями apply() для изменения следующего столбца матриц. Мне нужно помочь заставить функции работать, когда ни один из людей не соответствует этим критериям во время этой l oop итерации.

# here is a matrix of positions. the first column is the starting position,
# and this will change throughout, so second column is empty for now.
position <- cbind(c(10,20,10,20,10),c(NA,NA,NA,NA,NA)) 

# size of individuals. position in next column should change depending on size,
# such that small individuals (size < 5) will move up 5 positions, 
# and large individuals (> 8) will move down 7 positions. 
size <- c(2,2,3,8,8)

# for small individuals, add 5 to make next position
position[,2][ size < 5] <- mapply(sum,position[,1][size<5],5)  

# for large individuals, subtract 7 to make next position
position[,2][ size > 8 ] <- mapply(sum,position[,1][size > 8],-7)

Я продолжаю застревать, когда условие имеет 0 вхождений. В этом случае нет людей с размером> 8, поэтому функция mapply() не работает. Это дает мне ошибку:

  zero-length inputs cannot be mixed with those of non-zero length

Есть ли способ заставить функцию mapply() ничего не делать, если один из входов равен нулю?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Зачем использовать mapply? Это прекрасно работает с нормальной индексацией.

position[size < 5,2] <- position[size < 5,1] + 5
position[size > 8,2] <- position[size > 8,1] - 7
0 голосов
/ 06 августа 2020

Мы могли бы создать индекс для передачи vector значений и сделать это за один шаг (если есть несколько условий)

i1 <- 1 + 2 * (size < 5) + 4 * (size > 8)
position[,2] <- position[,1] + c(5, -7)[match(i1, unique(i1))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...