【发布时间】:2019-08-13 14:41:23
【问题描述】:
假设代码很简单:
a <- list()
a[[1]] <- c(1,2,3)
a[[2]] <- c(2,3,4)
我想询问列表中的向量成员关系并获取成员索引。
所以询问c(1,2,3)我会得到1,询问c(2,3,4)我会得到2。我该怎么做?
【问题讨论】:
假设代码很简单:
a <- list()
a[[1]] <- c(1,2,3)
a[[2]] <- c(2,3,4)
我想询问列表中的向量成员关系并获取成员索引。
所以询问c(1,2,3)我会得到1,询问c(2,3,4)我会得到2。我该怎么做?
【问题讨论】:
一种选择是使用setequal 或all.equal(来自base R)通过循环list 元素,返回一个逻辑索引并用which 包装
f1 <- function(lstObj, vec) {
which(sapply(lstObj, setequal, vec))
}
f1(a, 1:3)
#[1] 1
f1(a, 2:4)
#[1] 2
另外,正如 @IceCreamToucan 在 cmets 中提到的那样
f1n <- function(lstObj, vec){
which(sapply(lstObj, function(x, y) isTRUE(all.equal(x, y)), vec))
}
另一个选项是%in% 和all
f2 <- function(lstObj, vec) {
which(sapply(lstObj, function(x) all(x %in% vec)))
}
【讨论】:
which(sapply(lstObj, function(x, y) isTRUE(all.equal(x, y)), vec))。结果不同的示例:f1(list(c(2, 1, 3)), 1:3)
vectors 的长度不同,则list 将是合适的。如果不是,您可以将其作为matrix 或data.frame。要检查list 中的元素,可以进入list 的方法会很有用。使用lapply/sapply/mapply 中的任何一个(尽管在不同的上下文中)。把它包装在一个函数中是为了让它更简单