我试图在一个包含缺失值的字符串向量中检索一个模式的所有实例的索引。
例如,如何从以下内容中获取包含模式"a"
的所有实例的索引向量:
x = ["ab", "ca", "bc", missing, "ad"]
期望的结果将等于:
Vector([1, 2, 5])
3-element Vector{Int64}:
1
2
5
这些是模式出现的索引。
我试图在一个包含缺失值的字符串向量中检索一个模式的所有实例的索引。
例如,如何从以下内容中获取包含模式"a"
的所有实例的索引向量:
x = ["ab", "ca", "bc", missing, "ad"]
Vector([1, 2, 5])
3-element Vector{Int64}:
1
2
5
这些是模式出现的索引。
一种自然的编写方式是:
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
在这种情况下,代码可读性较低,但在其他情境中,您可能会发现passmissing
和coalesce
很有用,因此我提到了它们。
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
也有效,这正是我们想要的。