R условно заменить в 3D массив - PullRequest
0 голосов
/ 26 апреля 2020

Я хочу условно заменить значения в указанном векторе c в трехмерном массиве, причем значением замены является значение из расчета вероятности. По какой-то причине значение замещения является одинаковым для всех значений вектора, а не вычисляется на основе отдельных элементов вектора. У меня должно быть что-то простое неверное в моем синтаксисе

library (abind)
pop <- array(c (1,0,1,1,1,0,0,0,0,0,2,0,2,3,5), dim = c(1,5,3))
pop <- abind(pop,pop, along = 1)

, поэтому конкретный вектор, над которым я хочу работать, это

pop[dim(pop)[1], ,1]

[1] 1 0 1 1 1

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

ifelse (pop[dim(pop)[1], ,1] == 1, rbinom(1,1,0.5), 0)

, я не получаю никаких изменений

> ifelse (pop[dim(pop)[1], ,1] == 1, rbinom(1,1,0.5), 0)
[1] 1 0 1 1 1

или, в качестве альтернативы, меняются все значения.

> ifelse (pop[dim(pop)[1], ,1] == 1, rbinom(1,1,0.5), 0)
[1] 0 0 0 0 0

I Я ожидаю, что некоторые значения в массиве будут изменены, но не "все или ничего". Что я делаю неправильно? Также, если есть простой элегантный способ сделать замену обратно в исходный 3d-массив, я был бы благодарен. Спасибо. J

1 Ответ

0 голосов
/ 27 апреля 2020

Я думаю, что нашел решение, используя функцию "modify_if" пакета dplyr.

pop[dim(pop)[1], ,1] %<>% modify_if(~ .x == 1, ~ rbinom(1,1,pliv1))

HTH, J

...