DataFrames.jl - 按类型或名称子字符串选择列

int*_*o_r 3 dataframe julia

我是朱莉娅的新手。

在 DataFrames.jl 中,有没有办法选择给定类型的所有变量,或名称中带有给定子字符串的所有变量?

例如在 R 中我们有:

df %>% select_if(is.numeric)

df %>% select(matches("_some_string_"))

Run Code Online (Sandbox Code Playgroud)

谢谢。

Bog*_*ski 8

要选择具有给定子字符串的变量,请使用:

\n
select(df, r"_some_string_")\n
Run Code Online (Sandbox Code Playgroud)\n

实际上它比子字符串强大得多 - 它可以是任何Regex

\n

对于选择给定元素类型的变量,这更加棘手。问题是,在 Julia 中比在 R 中具有更大的灵活性。例如你可以有 eltypeAny,但向量仍然只包含数字。

\n

因此你可以写:

\n
select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))\n
Run Code Online (Sandbox Code Playgroud)\n

当然这里是有限制的,你可以改成Float64类似的RealNumber或者Union{Missing, Int}取决于您想要准确选择的内容。\也可以写:

\n
select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))\n
Run Code Online (Sandbox Code Playgroud)\n

这次您检查的不是容器的元素类型,而是存储值的实际类型。

\n

这是差异的一个简单示例:

\n
julia> df = DataFrame(a=[1.0], b=Any[1.0], c=[1])\n1\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 a       \xe2\x94\x82 b   \xe2\x94\x82 c     \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Float64 \xe2\x94\x82 Any \xe2\x94\x82 Int64 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 1.0     \xe2\x94\x82 1.0 \xe2\x94\x82 1     \xe2\x94\x82\n\njulia> select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))\n1\xc3\x971 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 a       \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Float64 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 1.0     \xe2\x94\x82\n\njulia> select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))\n1\xc3\x972 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 a       \xe2\x94\x82 b   \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Float64 \xe2\x94\x82 Any \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 1.0     \xe2\x94\x82 1.0 \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n