Dataframe 在Julia中转换数据帧时如何跳过缺少的值

Dataframe 在Julia中转换数据帧时如何跳过缺少的值,dataframe,julia,missing-data,Dataframe,Julia,Missing Data,我想转换Julia DataFrames.DataFrame中列中的每个元素,但在转换过程中跳过缺少的值(让它们保持在表中不变) 举个简单的例子,我们可以这样做: using DataFrames, DataFramesMeta @linq DataFrame(mode=[1,2,missing]) |> transform( mode = map(x->(if x === missing missing elseif x in ([0:5...]) x+1 else mi

我想转换Julia DataFrames.DataFrame中列中的每个元素,但在转换过程中跳过缺少的值(让它们保持在表中不变)

举个简单的例子,我们可以这样做:

using DataFrames, DataFramesMeta

@linq DataFrame(mode=[1,2,missing]) |>
transform(
    mode = map(x->(if x === missing missing elseif x in ([0:5...]) x+1 else missing end), :mode)
)
但它看起来或多或少杂乱无章。还有更优雅或简洁的方式吗

我阅读了Query.jl和DataFramesMeta.jl文档,希望找到一种不必显式跳过缺失值的方法

编辑: 我认为以下是我能想到的最好的:

using DataFrames, DataFramesMeta, DataValues

skipmap(f, c) = map(x->(if x===missing missing else f(x) end), c)

@linq DataFrame(mode=[1,2,missing]) |>
transform(
    mode = skipmap(x->if x in ([0:5...]) x+1 else x end, :mode)
)

我认为,如果map()以一种接受第三个参数y(因此map(f,c,y))的方式进行扩展,并在数组中保持这些元素的完整性(如果它们属于y的话),那就太好了。

passmissing
,由DataFrames导出。jl可以满足您的需要。 例如,您可以使用这样一个衬里:

julia> passmissing(x -> x + (x in 0:5)).([1,2,missing,4,5,6])
6-element Array{Union{Missing, Int64},1}:
 2
 3
  missing
 5
 6
 6
此外,如果传递函数
missing
,则可以在函数中使用广播作为
+
隐式返回
missing
,例如:

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

julia> x .+ in.(x, Ref(0:5))
6-element Array{Union{Missing, Int64},1}:
 2
 3
  missing
 5
 6
 6


检查
skipmissing
functionskipmissing()将从数组中完全删除缺少的元素。但我想做的只是忽略它们,让它们留在数组中,然后继续处理下一个未丢失的元素。为什么需要跳过它们?
转换(mode=:mode.+1)
就足够了吗?在这种情况下,它就足够了,因为
+
中的
将传播
缺少的
,但不是所有函数都这样做,这就是为什么提供了
passmissing
的原因。passmissing正是我想要的。要处理诸如passmissing(0:5中的x->x?x:missing)。([missing,2,3])应该需要使用passmissing。DataFrame文档中目前似乎没有提到该函数。谢谢你的其他有用的提示!此函数在Missings.jl中定义,仅由DataFrames.jl重新导出。本教程的最后一节对此进行了解释。哦,你就是作者!。谢谢你的额外宝石!
julia> (v -> v + in(v, 0:5)).(x)
6-element Array{Union{Missing, Int64},1}:
 2
 3
  missing
 5
 6
 6