在列表中查找向量元素的索引

时间:2014-07-14 02:07:42

标签: r list vector

我有这个玩具角色矢量:

a = c("a","b","c","d","e","d,e","f")

其中一些元素与逗号连接(例如" d,e")

以及包含该向量的唯一元素的列表,如果是逗号连接元素,则不保留其各自的组件。

所以这是清单:

l = list("a","b","c","d,e","f")

我正在寻找一种有效的方法来获取a列表中l元素的索引。对于由a中的逗号连接元素表示的l元素,它应返回l中这些逗号连接元素的索引。

所以这个函数的输出是:

c(1,2,3,4,4,4,5)

正如您所看到的,它为a元素返回索引4:" d"," e"和" d,e"

2 个答案:

答案 0 :(得分:2)

我会将搜索向量转换为一组正则表达式,方法是用管道替换逗号。根据{{​​1}}中的位置,将names添加到搜索向量中。

list

然后你可以这样做:

L <- setNames(lapply(l, gsub, pattern = ",", replacement = "|"), seq_along(l))

lapply(L, function(x) grep(x, a, value = TRUE)) # $`1` # [1] "a" # # $`2` # [1] "b" # # $`3` # [1] "c" # # $`4` # [1] "d" "e" "d,e" # # $`5` # [1] "f" 很重要,因为您现在可以使用names来获取所需内容。

stack

答案 1 :(得分:1)

您可以使用具有因素的策略。首先,使用

查找列表中每个元素的索引
l <- list("a","b","c","d,e","f")
idxtr <- Map(function(x) unique(c(x, strsplit(x, ",")[[1]])), unlist(l))

这为l中的每个项目构建了一个列表,以及每个元素的所有可能匹配项。然后我们使用向量a并使用这些级别创建一个因子,然后根据我们刚构建的列表重新分配

a <- c("a","b","c","d","e","d,e","f")
a <- factor(a, levels=unlist(idxtr));
levels(a) <- idxtr
as.numeric(a)
# [1] 1 2 3 4 4 4 5

最后,为了得到索引,我们在因子

上使用as.numeric