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



我是Julia的新手。

在DataFrames.jl中,有没有一种方法可以选择给定类型的所有变量,或者选择名称中有给定子字符串的所有变量?

例如,在R中,我们有:

df %>% select_if(is.numeric)
df %>% select(matches("_some_string_"))

谢谢。

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

select(df, r"_some_string_")

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

对于给定元素类型的变量的选择,这更为棘手。问题是,在Julia中,你比在R中有更多的灵活性。例如,您可以将eltype设为Any,但矢量仍然只包含数字。

因此,您可以写:

select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))

当然,这在这里是有限制的,您可以将Float64更改为类似RealNumberUnion{Missing, Int}的内容,具体取决于您想要选择的内容。或写入:

select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))

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

以下是差异的一个快速示例:

julia> df = DataFrame(a=[1.0], b=Any[1.0], c=[1])
1×3 DataFrame
│ Row │ a       │ b   │ c     │
│     │ Float64 │ Any │ Int64 │
├─────┼─────────┼─────┼───────┤
│ 1   │ 1.0     │ 1.0 │ 1     │
julia> select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))
1×1 DataFrame
│ Row │ a       │
│     │ Float64 │
├─────┼─────────┤
│ 1   │ 1.0     │
julia> select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))
1×2 DataFrame
│ Row │ a       │ b   │
│     │ Float64 │ Any │
├─────┼─────────┼─────┤
│ 1   │ 1.0     │ 1.0 │

具有特定子字符串的select列的另一个选项是使用Colscontains.查找具有特定子串的列。这里有一些可复制的代码:

julia> using DataFrames
julia> df = DataFrame(col1 = 1, col2 = 2, col3 = 3)
1×3 DataFrame
Row │ col1   col2   col3  
│ Int64  Int64  Int64 
─────┼─────────────────────
1 │     1      2      3
julia> select(df, Cols(contains.("2")))
1×1 DataFrame
Row │ col2  
│ Int64 
─────┼───────
1 │     2

最新更新