【问题标题】:replace logical elements in a list based on another logical list in R根据R中的另一个逻辑列表替换列表中的逻辑元素
【发布时间】:2021-06-28 06:12:27
【问题描述】:

我正在尝试根据另一个列表更改列表的逻辑值(元素)。基本上,如果两个列表都是“TRUE”,我想将主列表中的值更改为“FALSE”。两个列表的长度都是 5。例如

List_A <- list(c(TRUE,FALSE,TRUE),c(FALSE,TRUE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,TRUE),c(TRUE,FALSE,TRUE))

List_B <-list(c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,TRUE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,TRUE,TRUE))

列表 B 具有序列作为名称属性。

期望的输出:

Output <-
list(c(TRUE,FALSE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,FALSE,FALSE))

换句话说,listA 中的元素保持不变,除非它们在两个列表中都有匹配的 TRUE 值,这会将它们替换为 FALSE。 我已经尝试运行下面的 for 循环,但它不起作用,我不知道如何重定向输出,如果这样做的话。

for(i in 1:length(List_A)) { List_A[[i]][List_B[[i]]] &lt;- FALSE }

【问题讨论】:

  • 是否有理由不将这些列表转换为矩阵?这样就没有必要使用循环了(Map 也是一个循环)。
  • 谢谢!地图功能很好用。我有一个下游函数,它要求输入是列表,这就是我像这样使用它们的原因

标签: r list function nested-loops


【解决方案1】:

你可以借助Map函数。

如果两个值都是TRUE,则转到FALSE 或保留来自List_A 的值。

Output <- Map(function(x, y) replace(x, x & y, FALSE), List_A, List_B)
Output
#[[1]]
#[1]  TRUE FALSE  TRUE

#[[2]]
#[1] FALSE FALSE  TRUE

#[[3]]
#[1] FALSE FALSE FALSE

#[[4]]
#[1]  TRUE  TRUE FALSE

#[[5]]
#[1]  TRUE FALSE FALSE

数据

List_A <- list(c(TRUE,FALSE,TRUE),c(FALSE,TRUE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,TRUE),c(TRUE,FALSE,TRUE))
List_B <- list(c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,TRUE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,TRUE,TRUE)) 

【讨论】:

  • 非常感谢!!!这很好用。但是,输出并不像我想要的那样准确。我只希望将两个列表中具有 TRUE 的元素替换为 FALSE。如果匹配为“FALSE”,我希望它保持为 FALSE。我怎样才能做到这一点?我已经更新了问题以显示所需的结果
【解决方案2】:

我们可以使用map2

library(purrr)
map2(List_A, List_B, ~ !(.x & .y))

数据

List_A <- list(c(TRUE,FALSE,TRUE),c(FALSE,TRUE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,TRUE),c(TRUE,FALSE,TRUE))
List_B <- list(c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,TRUE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,TRUE,TRUE)) 

【讨论】:

  • 谢谢你。如果我只想将匹配的 TRUE 值更改为 FALSE 并将其余的值保留在 ListA 中,我该如何调整代码?
  • @user15520242 在这种情况下,只需在反引号中执行 map2(List_A, List_B, &) &amp;
  • 实际上,这仍然提供与~ !(.x &amp; .y) 相同的输出,只是 TRUE 的总计数已与 FALSE 交换。但是,如果我用上面@ronak 的函数替换它,那么它会给出预期的输出。不管怎样,谢谢!
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 2023-02-03
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多