如何处理 Julia 中布尔上下文中的缺失?

Luc*_*cas 4 missing-data dataframe julia

我正在尝试根据来自其他(数字)列的值范围创建一个分类变量。但是,当我missings在数字列中时,代码不起作用

这是一个可复制的示例:

using RDatasets;
using DataFrames;
using Pipe;
using FreqTables;

df = dataset("datasets","iris")
#lowercase columns just for convenience
@pipe df |> rename!(_, [lowercase(k) for k in names(df)]);

#without this line, the code works fine
@pipe df |> allowmissing!(_, :sepallength) |> replace!(_.sepallength, 4.9 => missing);

df[:size] = @. ifelse(df[:sepallength]<=4.7, "small", missing)
df[:size] = @. ifelse((df[:sepallength]>4.7) & (df[:sepallength]<=4.9), "avg", df[:size])
df[:size] = @. ifelse((df[:sepallength]>4.9) & (df[:sepallength]<=5), "large", df[:size])
df[:size] = @. ifelse(df[:sepallength]>5, "huge", df[:size])

println(@pipe df |> freqtable(_, :size))
Run Code Online (Sandbox Code Playgroud)

输出:

TypeError: non-boolean (Missing) used in boolean context
Run Code Online (Sandbox Code Playgroud)

我想忽略数值变量中的缺失情况,但我不能只删除缺失值,因为这会删除数据集中的其他重要信息。此外,如果我只删除sepallength列中的缺失内容,则df[:size]长度将与原始dataframe.

Bog*_*ski 5

coalesce像这样使用函数:

julia> x = [1,2,3,missing,5,6,7]
7-element Array{Union{Missing, Int64},1}:
 1
 2
 3
  missing
 5
 6
 7

julia> @. ifelse(coalesce(x < 4.7, false), "small", missing)
7-element Array{Union{Missing, String},1}:
 "small"
 "small"
 "small"
 missing
 missing
 missing
 missing
Run Code Online (Sandbox Code Playgroud)

作为一个侧面说明不写df[:size](这句法已经现在已经过时了2年多,很快就会报错),而是df.sizedf."size"访问的数据帧的列(df."size"是情况下,当列名包含如空格字符等。 ,例如 df.“我的奇葩专栏!”)。

  • 实际上我认为“df.size”也更容易输入和阅读。 (2认同)