DataFrames.jl - выбор столбцов по типу или названию подстроки - PullRequest
1 голос
/ 07 августа 2020

Я новичок в Джулии.

В DataFrames.jl есть способ выбрать все переменные заданного типа или все переменные с заданной подстрокой в ​​их именах?

Например, в R мы имеем:

df %>% select_if(is.numeric)

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

Спасибо.

1 Ответ

1 голос
/ 07 августа 2020

Для выбора переменных с заданной подстрокой используйте:

select(df, r"_some_string_")

на самом деле он намного мощнее подстроки - это может быть любая Regex.

Для выбора переменных для данного типа элемента это сложнее. Проблема в том, что в Julia у вас гораздо больше гибкости, чем в R здесь. Например, у вас может быть eltype Any, но вектор по-прежнему содержит только числа.

Поэтому вы можете написать:

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 │
...