我是朱莉娅的新手。
在 DataFrames.jl 中,有没有办法选择给定类型的所有变量,或名称中带有给定子字符串的所有变量?
例如在 R 中我们有:
df %>% select_if(is.numeric)
df %>% select(matches("_some_string_"))
Run Code Online (Sandbox Code Playgroud)
谢谢。
要选择具有给定子字符串的变量,请使用:
\nselect(df, r"_some_string_")\nRun Code Online (Sandbox Code Playgroud)\n实际上它比子字符串强大得多 - 它可以是任何Regex。
对于选择给定元素类型的变量,这更加棘手。问题是,在 Julia 中比在 R 中具有更大的灵活性。例如你可以有 eltypeAny,但向量仍然只包含数字。
因此你可以写:
\nselect(df, findall(col -> eltype(col) <: Float64, eachcol(df)))\nRun Code Online (Sandbox Code Playgroud)\n当然这里是有限制的,你可以改成Float64类似的Real,Number或者Union{Missing, Int}取决于您想要准确选择的内容。\也可以写:
select(df, findall(col -> all(v -> v isa Float64, col), eachcol(df)))\nRun Code Online (Sandbox Code Playgroud)\n这次您检查的不是容器的元素类型,而是存储值的实际类型。
\n这是差异的一个简单示例:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n