在 Julia 中查找包含缺失值的字符串向量中某个模式的索引

4

我试图在一个包含缺失值的字符串向量中检索一个模式的所有实例的索引。

例如,如何从以下内容中获取包含模式"a"的所有实例的索引向量:

x = ["ab", "ca", "bc", missing, "ad"]


期望的结果将等于:
Vector([1, 2, 5])
3-element Vector{Int64}:
 1
 2
 5

这些是模式出现的索引。

2个回答

4

一种自然的编写方式是:

julia> findall(v -> ismissing(v) ? false : contains(v, "a"), x)
3-element Vector{Int64}:
 1
 2
 5

或者你可以写成:

julia> using Missings

julia> findall(coalesce.(passmissing(contains).(x, "a"), false))
3-element Vector{Int64}:
 1
 2
 5

在这种情况下,代码可读性较低,但在其他情境中,您可能会发现passmissingcoalesce很有用,因此我提到了它们。


1
< p > findall 的版本可以更加简洁:

julia> findall(contains("a"), skipmissing(x))
3-element Vector{Int64}:
 1
 2
 5


这里的第一个亮点是,当仅提供要搜索的模式时,contains返回其柯里化版本。因此,在这里,contains(“a”)返回一个函数,该函数在任何给定的字符串参数中搜索“a”,我们将该函数作为谓词传递给findall
更酷的是skipmissing的工作方式。正如名称所示,它跳过其参数中的missing值,但不仅仅是从x中过滤它们(这会改变所有missing之后的值的索引),而是通过提供一个迭代器来跳过missing值。这意味着通过迭代skipmissing(x)返回的索引对于x也有效,这正是我们想要的。

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