在R中查找列表条目的索引

5

给定一个 R 列表,我想找到给定列表条目的索引。例如,对于条目"36",我的输出应该是"2"。此外,如何使用 lapply 并行执行这样的查询?


> list

$`1`
[1] "7"  "12" "26" "29"

$`2`
[1] "11" "36"

$`3`
[1] "20" "49"

$`4`
[1] "39" "41"

也许像 lapply(component_list, function(x) any(match(x, "36"))) 这样的代码可以让你接近目标。 - Tyler Rinker
2
你的例子不够明确,因为“36”既是第二个列表元素,也是第二个列表中的第二个元素。 - Joshua Ulrich
2个回答

11

这是一个一行代码,它可以允许(很可能)列表中的多个元素包含您正在搜索的字符串:

## Some example data
ll <- list(1:4, 5:6, 7:12, 1:12)
ll <- lapply(ll, as.character)

which(sapply(ll, FUN=function(X) "12" %in% X))
# [1] 3 4

1
非常感谢!R语言在开始时可能会有些令人头痛。 - SAT
1
@Josh:你的示例应该返回[1] 3 4,对吗? - Carl Witthoft
1
@CarlWitthoft -- 是的,谢谢。 (我早些时候进行了快速代码编辑,但显然忽略了更改结果部分。)现在已经修复了。此外,请随意自行编辑类似的内容(至少在我的任何帖子中)! - Josh O'Brien
这个代码是可以运行的,但是为什么你要先将它转换成字符呢?对我来说,只用 which(sapply(ll, FUN=function(X) 12 %in% X)) 就可以了。 - mikey
1
@mikey OP的问题是关于字符向量列表的,所以看起来我创建了一个与他们的匹配的示例。是的,它将更普遍地工作。 - Josh O'Brien
@JoshO'Brien。谢谢,我没有仔细看问题。 - mikey

3
你可以先将列表转换为一个数据框,将值映射到列表中对应的索引:
ll <- list(c("7", "12", "26", "29"),
           c("11", "36"),
           c("20", "49"),
           c("39", "41"))

df <- data.frame(value = unlist(ll),
                 index = rep(seq_along(ll), lapply(ll, length)))
df
#    value index
# 1      7     1
# 2     12     1
# 3     26     1
# 4     29     1
# 5     11     2
# 6     36     2
# 7     20     3
# 8     49     3
# 9     39     4
# 10    41     4

然后,编写一个使用match函数查找给定值第一次出现的索引的函数:

find.idx <- function(val)df$index[match(val, df$value)]

您可以在单个值上调用此函数,也可以一次在多个值上进行操作,因为match是矢量化的:

find.idx("36")
# [1] 2
find.idx(c("36", "41", "99"))
# [1]  2  4 NA

当然,您也可以通过lapply运行它,特别是如果您计划并行运行:

lapply(c("36", "41", "99"), find.idx)
# [[1]]
# [1] 2
# 
# [[2]]
# [1] 4
# 
# [[3]]
# [1] NA

如果想要并行运行最后一部分,有很多选择。我建议你通过搜索 http://cran.r-project.org/web/views/HighPerformanceComputing.html来权衡不同的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接