Как фильтровать строки из массива Julia на основе значения value в указанном столбце?

#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  │ _     │
├─────┼───────┼───────┼───────┼───────┤
│ 11"...""...""..." │
│ 21"...""...""..." │
│ 32"...""...""..." │
│ 42"...""...""..." │
│ 52"...""...""..." │

julia> df[df[:CLASS] .== 1, :] # Refer to the column by its header name
2×4 DataFrames.DataFrame
│ Row │ CLASS │ col2  │ col3  │ _     │
├─────┼───────┼───────┼───────┼───────┤
│ 11"...""...""..." │
│ 21"...""...""..." 

В пакете DataFramesMeta доступно еще больше инструментов, направленных на упрощение этого (и других пакетов, активно разрабатываемых). Вы можете использовать его @where макрос для фильтрации в стиле SQL:

 julia> using DataFramesMeta
julia> @where(df, :CLASS .== 1)
2×4 DataFrames.DataFrame
│ Row │ CLASS │ col2  │ col3  │ _     │
├─────┼───────┼───────┼───────┼───────┤
│ 11"...""...""..." │
│ 21"...""...""..." 

Комментарии:

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. Я думал, что это «кража», чтобы отредактировать мой ответ на ваш ответ