R中列表中向量的相应比较
corresponding comparison of vectors within a list in R
我有一个包含 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) 时,该函数将 return 具有 TRUE 值的逻辑向量。
当出现以下任何情况时:(mylist[[1]][[i]], mylist[[2]][[i]], mylist[[3]][[i]], mylist[[4]][ [i]]) 为真,output_vector[i] 应为真。
我想到了两种解决方案,一种是嵌套 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()?
如果我们需要逐元素比较,使用Reduce
out1 <- Reduce(`|`, mylist)
这类似于 do.call
方法 Map
和 any
out2 <- unlist(do.call(Map, c(f = any, mylist)))
all.equal(out1, out2)
#[1] TRUE
在嵌套的for
循环中
mylist[[j]][[i]]
是 list
中的单个元素,它被 any
包裹起来。因此,被初始化为 'mylist' 的第一个 vector
元素的 length
的 my_vector
正在被回收,它将 return 最后一个 list
元素
如果我们在 function
for
循环中做一个小改动,它会给出相同的输出,即关键是检查 'my_vector' 中的元素是否在相同的位置连同从 'mylist' 索引的元素具有 any
TRUE 值,而不是仅检查单个元素并将其覆盖为 my_vector
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(c(my_vector[i], mylist[[j]][[i]]))
}
}
my_vector
}
out3 <- my_function()
identical(out1, out3)
#[1] TRUE
这是另一个可能适用于您的问题的基本 R 选项
colSums(do.call(rbind,mylist))>1
计算列中 TRUE
的数量。如果存在 NA
,则返回 NA
。
我有一个包含 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) 时,该函数将 return 具有 TRUE 值的逻辑向量。 当出现以下任何情况时:(mylist[[1]][[i]], mylist[[2]][[i]], mylist[[3]][[i]], mylist[[4]][ [i]]) 为真,output_vector[i] 应为真。
我想到了两种解决方案,一种是嵌套 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()?
如果我们需要逐元素比较,使用Reduce
out1 <- Reduce(`|`, mylist)
这类似于 do.call
方法 Map
和 any
out2 <- unlist(do.call(Map, c(f = any, mylist)))
all.equal(out1, out2)
#[1] TRUE
在嵌套的for
循环中
mylist[[j]][[i]]
是 list
中的单个元素,它被 any
包裹起来。因此,被初始化为 'mylist' 的第一个 vector
元素的 length
的 my_vector
正在被回收,它将 return 最后一个 list
元素
如果我们在 function
for
循环中做一个小改动,它会给出相同的输出,即关键是检查 'my_vector' 中的元素是否在相同的位置连同从 'mylist' 索引的元素具有 any
TRUE 值,而不是仅检查单个元素并将其覆盖为 my_vector
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(c(my_vector[i], mylist[[j]][[i]]))
}
}
my_vector
}
out3 <- my_function()
identical(out1, out3)
#[1] TRUE
这是另一个可能适用于您的问题的基本 R 选项
colSums(do.call(rbind,mylist))>1
计算列中 TRUE
的数量。如果存在 NA
,则返回 NA
。