【发布时间】:2020-12-27 20:40:38
【问题描述】:
我有一个包含 4 个逻辑向量的列表(mylist):
list(a = c(NA, FALSE, FALSE, TRUE, FALSE, NA, NA, NA, FALSE,
FALSE, FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, TRUE, TRUE,
TRUE, TRUE, NA, FALSE, NA, TRUE, FALSE, FALSE, NA, TRUE, FALSE,
NA, TRUE, NA, TRUE, FALSE, NA, NA, NA, NA, FALSE, NA, NA, NA,
NA, FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, TRUE, NA,
FALSE, TRUE, NA, FALSE, TRUE, NA, NA, NA, NA, FALSE, NA, FALSE,
NA, NA, NA, FALSE, TRUE, TRUE, NA, TRUE, NA, NA, FALSE, FALSE,
TRUE, NA, FALSE, FALSE, FALSE, NA, NA, FALSE, NA, FALSE, NA,
FALSE, NA, NA, NA, NA, FALSE, NA, TRUE, TRUE, FALSE, TRUE, NA,
FALSE, TRUE, NA, TRUE, NA, TRUE, FALSE, NA, NA, FALSE, TRUE,
FALSE, NA, FALSE, NA, TRUE, FALSE, NA, FALSE, FALSE, NA, TRUE,
TRUE, NA, FALSE, TRUE, FALSE, FALSE, NA, NA, NA, NA, TRUE, FALSE,
NA, NA, FALSE, NA, NA, NA, NA, NA, TRUE, NA, NA, FALSE, TRUE,
NA, NA, NA, FALSE, NA, NA, NA, NA, NA, TRUE, TRUE, NA, FALSE,
NA, NA, FALSE, NA, FALSE, TRUE, TRUE, FALSE, TRUE, NA, TRUE,
NA, NA), b = c(NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, FALSE,
FALSE, FALSE, FALSE, NA, TRUE, NA, FALSE, TRUE, TRUE, FALSE,
FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, FALSE, NA, TRUE, FALSE,
NA, TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, NA, NA,
NA, FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, FALSE, NA,
FALSE, TRUE, NA, FALSE, TRUE, NA, NA, NA, NA, TRUE, NA, FALSE,
NA, NA, NA, FALSE, TRUE, TRUE, NA, TRUE, NA, NA, FALSE, FALSE,
FALSE, NA, FALSE, FALSE, FALSE, NA, NA, FALSE, NA, TRUE, NA,
TRUE, NA, NA, NA, NA, FALSE, NA, TRUE, TRUE, FALSE, FALSE, NA,
FALSE, FALSE, NA, FALSE, NA, TRUE, FALSE, NA, NA, TRUE, FALSE,
FALSE, NA, TRUE, NA, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE,
FALSE, NA, TRUE, TRUE, FALSE, FALSE, NA, NA, NA, NA, TRUE, FALSE,
NA, NA, TRUE, NA, NA, NA, NA, NA, FALSE, NA, NA, TRUE, TRUE,
NA, NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, FALSE, NA, FALSE,
NA, NA, FALSE, NA, TRUE, TRUE, FALSE, FALSE, FALSE, NA, FALSE,
NA, NA), c = c(NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, FALSE,
FALSE, TRUE, FALSE, NA, FALSE, NA, TRUE, TRUE, TRUE, FALSE, FALSE,
TRUE, NA, TRUE, NA, FALSE, FALSE, FALSE, NA, TRUE, FALSE, NA,
TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, NA, NA, NA,
FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, FALSE, NA, FALSE,
TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, TRUE, NA,
NA, NA, FALSE, TRUE, TRUE, NA, TRUE, NA, NA, FALSE, FALSE, FALSE,
NA, FALSE, FALSE, TRUE, NA, NA, FALSE, NA, TRUE, NA, TRUE, NA,
NA, NA, NA, FALSE, NA, FALSE, TRUE, FALSE, FALSE, NA, TRUE, FALSE,
NA, FALSE, NA, TRUE, FALSE, NA, NA, FALSE, FALSE, FALSE, NA,
TRUE, NA, FALSE, FALSE, NA, TRUE, FALSE, NA, FALSE, FALSE, NA,
TRUE, FALSE, FALSE, FALSE, NA, NA, NA, NA, FALSE, FALSE, NA,
NA, TRUE, NA, NA, NA, NA, NA, FALSE, NA, NA, TRUE, TRUE, NA,
NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, TRUE, NA, FALSE, NA,
NA, FALSE, NA, FALSE, TRUE, FALSE, FALSE, TRUE, NA, FALSE, NA,
NA), d = c(NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, FALSE,
FALSE, FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, TRUE, FALSE,
FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, FALSE, NA, FALSE,
FALSE, NA, TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA,
NA, NA, NA, FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, FALSE,
NA, FALSE, FALSE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA,
FALSE, NA, NA, NA, FALSE, TRUE, FALSE, NA, FALSE, NA, NA, FALSE,
FALSE, TRUE, NA, FALSE, FALSE, FALSE, NA, NA, FALSE, NA, FALSE,
NA, TRUE, NA, NA, NA, NA, FALSE, NA, FALSE, TRUE, FALSE, FALSE,
NA, FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, NA, NA, FALSE,
FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, NA, TRUE, FALSE, NA,
FALSE, FALSE, NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, NA,
TRUE, FALSE, NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, NA, NA,
FALSE, FALSE, NA, NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, FALSE,
NA, FALSE, NA, NA, FALSE, NA, FALSE, FALSE, FALSE, FALSE, FALSE,
NA, TRUE, NA, NA))
我想要一个函数,当原始向量中的任何对应值为 TRUE (output_vector) 时,该函数将返回具有 TRUE 值的逻辑向量。 当以下任何一种情况:(mylist[[1]][[i]]、mylist[[2]][[i]]、mylist[[3]][[i]]、mylist[[4]][ [i]]) 为 TRUE,output_vector[i] 应为 TRUE。
我想出了两种解决方案,一种是嵌套的 for 循环,另一种是 mapply:
#嵌套for循环:
my_function<-function(){
my_vector<-logical(length(mylist[[1]]))
for (i in 1:length(mylist[[1]])){
for (j in 1:length(mylist)){
my_vector[i]<-any(mylist[[j]][[i]]==T)
}
}
my_vector
}
my_function()
映射:
mapply(any, mylist[[1]], mylist[[2]], mylist[[3]], mylist[[4]])
我很惊讶,因为: 1-) #mapply 和 #nested for 循环方法产生了不同的结果
也许嵌套的 for 循环方法有问题?不过,mapply 看起来更干净,效果也更符合我的预期。
额外问题:有没有办法在 mapply 方法中使用某种 do.call(),这样我就不必写出 any() 的每个参数?
【问题讨论】:
-
与
mapply进行了相应的比较。你想在for循环中进行比较 -
嗨@akrun,我想要一个相应的比较。我在 for 循环中弄错了吗?
-
你对应的比较是
unlist(do.call(Map, c(f = any, mylist)))而不是指定每个元素 -
好的,谢谢@akrun。我看到您的方法产生的结果与我的 mapply 方法完全相同。我的方式有什么不好的做法吗?不太清楚为什么我需要调用 unlist() 和 map()
-
使用
mapply,参数默认为SIMPLIFY = TRUE,因此它可能会强制转换为矩阵或保持为list,这取决于Map,我们可以确定它总是返回一个list