我希望你能帮忙翻译一下,涉及 IT 技术相关内容。需要在 DataFrames.jl 中选择给定类型的所有变量或具有给定子字符串名称的所有变量。例如,在 R 中我们可以使用以下代码:
df %>% select_if(is.numeric)
df %>% select(matches("_some_string_"))
谢谢。
使用以下方法选择包含指定子字符串的变量:
select(df, r"_some_string_")
实际上,它比子字符串强大得多 - 它可以是任何Regex
。
对于选择给定元素类型的变量,这更加棘手。问题在于在 Julia 中,您比在 R 中具有更大的灵活性。例如,您可以有Any
类型的eltype,但向量仍仅包含数字。
因此,您可以编写以下内容:
select(df, findall(col -> eltype(col) <: Float64, eachcol(df)))
当然,在这里限制非常严格,你可以将 Float64
更改为像 Real
、Number
或者 Union{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 │
Cols
和 contains
来选择包含特定子字符串的列。以下是一些可复现的代码: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
nonmissingtype(eltype(col))
来获取列类型的T
部分,如果它是一个Union{Missing,T}
。 - BallpointBen