朱莉娅:在缺少的向量中找到大于0的值

问题描述 投票:1回答:1

我是朱莉娅的新手,作为一个Matlab / R用户,我发现它在很大程度上非常适合合作。

但是,我对缺失的值以及如何使用它们感到困惑。

假设我有一个向量:

a=[missing -1 2 3 -12] #Julia
a=[NaN -1 2 3 -12] #Matlab

在Matlab中,我将执行以下操作以查找低于0的值

a(a<0)

这给了我

-1 -12

遗憾的是,在朱莉娅和我尝试的时候,这一点都不起作用

a[a.<0]

在朱莉娅我只是得到以下错误

ERROR: ArgumentError: unable to check bounds for indices of type Missing

我也试过以下

a[findall(skipmissing(a).<0)]

这给了我

missing
3

当然,我跳过了findall-function中的缺失值。我很确定有一种简单而合理的方法可以做到这一点,但我似乎无法找到它。

有人可以给我指路吗?

最好,理查德

julia missing-data
1个回答
6
投票

这是最简单的方法:

julia> a=[missing -1 2 3 -12]
1×5 Array{Union{Missing, Int64},2}:
 missing  -1  2  3  -12

julia> a[isless.(a, 0)]
2-element Array{Union{Missing, Int64},1}:
  -1
 -12

这使用missing被认为比isless任何数字都大的事实。

另一种写作方式:

julia> filter(x -> isless(x, 0), a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12

现在为了避免使用isless这一特殊技巧,您可以执行以下操作(使用coalesce是一种可用于安全处理missing值的通用方法):

julia> a[coalesce.(a .< 0, false)]
2-element Array{Union{Missing, Int64},1}:
  -1
 -12

要么

julia> filter(x -> coalesce(x < 0, false), a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12

最后你可以更明确地说:

julia> filter(x -> !ismissing(x) && x < 0, a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12

要么

julia> [v for v in a if !ismissing(v) && v < 0]
2-element Array{Int64,1}:
  -1
 -12

(你也可以在上面的例子中使用理解语法)

© www.soinside.com 2019 - 2024. All rights reserved.