我有这个玩具角色矢量:
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"
答案 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