如何根据指定列中的值来过滤Julia Array中的行?

时间:2016-10-08 20:29:08

标签: filter julia

我在文本文件中有这样的数据:

CLASS     col2    col3    ...
1         ...     ...     ...
1         ...     ...     ...
2         ...     ...     ...
2         ...     ...     ...
2         ...     ...     ...

我使用以下代码加载它们:

data = readdlm("file.txt")[2:end, :] # without header line

现在我想从第1类获得只有行的数组。

(如果有帮助,可以使用其他功能加载数据。)

2 个答案:

答案 0 :(得分:4)

data[find(x -> a[x,1] == 1, 1:size(data)[1]),:]

答案 1 :(得分:3)

逻辑索引是对数组进行过滤的直接方式:

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 package还有更多可用的工具,旨在使这更简单(其他包正在积极开发中)。您可以使用其@where宏来执行SQL样式过滤:

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