首页 > 解决方案 > 使用 purrr modify2 根据两个向量的元素修改一个向量

问题描述

我正在尝试根据使用两个不同向量的两个条件修改向量中的值,并且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(两个数组中的相同索引),然后用生成的值替换 .x 中的 2 rbinom(1,1,prob[1]) * 2,我认为应该是 0 还是 2?然后如果.x == 2.y != 0,使用不同的概率来替换 中的值arr1。我还希望为每个条目单独完成 rbinom 计算,如果这有意义吗?我是否需要使用function (x) ...... 符号来评估每个实例?显然更简单和/或更优雅的解决方案最受欢迎。谢谢。Ĵ

标签: rarraystidyversepurrr

解决方案


一种可能的解决方案是使用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作为第一个参数传递,因此您可以简单地将结果用标准<-.


推荐阅读