Поиск индексов в кадре данных с несколькими условиями с функцией findall () - PullRequest
2 голосов
/ 01 декабря 2019

in Julia 1.3

Как можно искать элементы в кадре данных с несколькими условиями. Вот пример с набором данных iris.csv (доступен для скачивания здесь )

df = CSV.read(".../iris.csv");
df[1:6,:]

6 rows × 5 columns
    sepal_length    sepal_width petal_length    petal_width species
    Float64 Float64 Float64 Float64 String
1   5.1 3.5 1.4 0.2 setosa
2   4.9 3.0 1.4 0.2 setosa
3   4.7 3.2 1.3 0.2 setosa
4   4.6 3.1 1.5 0.2 setosa
5   5.0 3.6 1.4 0.2 setosa
6   5.4 3.9 1.7 0.4 setosa

Допустим, я хочу выбрать индексы строк с sepal_length, равным 5.1:

findall(df[:,1] .== 5.1)

9-element Array{Int64,1}:
  1
 18
 20
 22
 24
 40
 45
 47
 99

Теперь то же самое с выбором индексов с видом "setosa":

findall(df[:,5] .== "setosa")[1:10]
10-element Array{Int64,1}:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10

Давайте теперь скажем, что я хочу выбрать индексы строк с длиной sepal_length, равным 5.1, и видом "setosa" (Iпробовал синтаксис, аналогичный функции which() в R):

findall(df[:,1] .== 5.1 & df[:,5] .== "setosa")

MethodError: no method matching &(::Float64, ::PooledArrays.PooledArray{String,UInt32,1,Array{UInt32,1}})
Closest candidates are:
  &(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:529

Stacktrace:
 [1] top-level scope at In[149]:1

Какую команду использовать вместо этого?

1 Ответ

4 голосов
/ 01 декабря 2019

Вам необходимо передать оператор & (обратите внимание на круглые скобки и точку перед &),

findall((df[:,1] .== 5.1) .& (df[:,5] .== "setosa"))

Обратите внимание, однако, что df[:,1] .== 5.1 и df[:,5] .== "setosa" оба назначают временныемассивы. Подумайте об использовании версии findall, которая принимает функцию в качестве первого аргумента, например так:

findall(x -> x.sepal.length == 5.1 && x.species == "setosa", eachrow(df))
...