#filter #julia
#Фильтр #джулия
Вопрос:
У меня есть такие данные в текстовом файле:
CLASS col2 col3 ...
1 ... ... ...
1 ... ... ...
2 ... ... ...
2 ... ... ...
2 ... ... ...
Я загружаю их, используя следующий код:
data = readdlm("file.txt")[2:end, :] # without header line
И теперь я хотел бы получить массив со строками только из класса 1.
(Данные могут быть загружены с помощью какой-либо другой функции, если это поможет.)
Комментарии:
1. Возможно, вам пригодится викиучебник .
Ответ №1:
Логическое индексирование — это простой способ выполнить фильтрацию в массиве:
data[data[:,1] .== 1, :]
Однако, если вы читаете свой файл как фрейм данных, вам будет доступно больше опций, и он будет отслеживать ваши заголовки:
julia> using DataFrames
julia> df = readtable("file.txt", separator=' ')
5×4 DataFrames.DataFrame
│ Row │ CLASS │ col2 │ col3 │ _ │
├─────┼───────┼───────┼───────┼───────┤
│ 1 │ 1 │ "..." │ "..." │ "..." │
│ 2 │ 1 │ "..." │ "..." │ "..." │
│ 3 │ 2 │ "..." │ "..." │ "..." │
│ 4 │ 2 │ "..." │ "..." │ "..." │
│ 5 │ 2 │ "..." │ "..." │ "..." │
julia> df[df[:CLASS] .== 1, :] # Refer to the column by its header name
2×4 DataFrames.DataFrame
│ Row │ CLASS │ col2 │ col3 │ _ │
├─────┼───────┼───────┼───────┼───────┤
│ 1 │ 1 │ "..." │ "..." │ "..." │
│ 2 │ 1 │ "..." │ "..." │ "..." │
В пакете DataFramesMeta доступно еще больше инструментов, направленных на упрощение этого (и других пакетов, активно разрабатываемых). Вы можете использовать его @where
макрос для фильтрации в стиле SQL:
julia> using DataFramesMeta
julia> @where(df, :CLASS .== 1)
2×4 DataFrames.DataFrame
│ Row │ CLASS │ col2 │ col3 │ _ │
├─────┼───────┼───────┼───────┼───────┤
│ 1 │ 1 │ "..." │ "..." │ "..." │
│ 2 │ 1 │ "..." │ "..." │ "..." │
Комментарии:
1. Для меня
df[df[:CLASS] .== 1, :]
выдало ошибку, ноdf[df[!, :CLASS] .== 1, :]
сработало.
Ответ №2:
data[find(x -> a[x,1] == 1, 1:size(data)[1]),:]
Комментарии:
1. Не нужно делать это таким запутанным. Просто
data[data[:,1] .== 1, :]
должно сработать.2. О Господи, я так долго пытался это сделать, забыл сделать: в конце
3. @MattB. Вы могли бы написать это как отдельный ответ. 😉
4. @Luke готово. Я подумал, что это может быть простое редактирование
@isebarn
, но я добавил еще несколько вариантов в свой ответ.5. Я думал, что это «кража», чтобы отредактировать мой ответ на ваш ответ