Использование purrr modify2 для изменения вектора на основе элементов двух векторов - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь изменить значения в векторе на основе двух условий с использованием двух разных векторов и purrr::modify2, не совсем правильно синтаксис и не могу найти примеры в Интернете. Вот mwe:

library(tidyverse)
library(magrittr)
arr1 <- c(6, 2, 3, 2, 1, 5, 4, 2, 3, 7)
arr2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
prob <- c(0.65, 0.45)

arr1 %<>% modify2(arr1,
                  arr2,
                  ~ if (.x == 2 & .y == 0) ~ rbinom(1,1,prob[1]) * 2
                  else
                       if (.x == 2 & .y != 0) ~ rbinom(1,1,prob[2]) * 2)

Я пытаюсь найти, когда .x == 2 и .y == 0 (тот же индекс в обоих массивах), а затем заменить 2 в .x значением, созданным rbinom(1,1,prob[1]) * 2, который, я думаю, должен быть либо 0, либо 2? Затем, если .x == 2 и .y != 0, используйте другую вероятность для замены значения в arr1. Я также хочу, чтобы расчет rbinom выполнялся индивидуально для каждой записи, если это имеет смысл? Нужно ли мне использовать нотацию function (x) ......, чтобы она выполнялась для каждого экземпляра? Ясно, что более простые и / или более элегантные решения приветствуются. Спасибо. Дж

1 Ответ

1 голос
/ 29 мая 2020

Одно из возможных решений - использовать case_when:

arr1 <- modify2(arr1, arr2, ~dplyr::case_when(
  .x == 2 && .y == 0 ~ rbinom(1,1,prob[1]) * 2,
  .x == 2 && .y != 0 ~ rbinom(1,1,prob[2]) * 2,
  TRUE ~ .x ))

Обратите внимание, что вам не нужно %<>%; вы уже передаете arr1 в качестве первого аргумента, поэтому вы можете просто вернуть результат стандартным <-.

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