2017-01-22 1 views
1

Wenn ich versuche, die Höchstwerte von Differenzen von Spalten in einem DataFrame abzurufen, erhalte ich einen Fehler. Was ist falsch?min/max bei Differenzen von DataFrame-Spalten in Julia

using DataFrames 

a = [2,4,10,4,8,8] 
b = [5,9,7,2,8,7] 
c = [2,9,7,6,8,1] 

df = DataFrame(A = a, B = b, C = c) 
df[2,:A] = NA 
df[3,:C] = NA 

ab=df[:A] - df[:B] 
bc=df[:B] - df[:C] 
ac=df[:A] - df[:C] 

df[:max] = max(ab, bc, ac) 

println(df) 

=> Loaderror: MethodError: keine Methode Anpassungs isLess (:: DataArrays.DataArray Int64,1 {}, {:: Array Any, 1})

Dadurch könnte die maximal beiden df[:max] = max(ab, bc) oder df[:max] = max(a, b, c) funktioniert wie erwartet.

Kann jemand klären, was vor sich geht? Vielen Dank!

Antwort

3

Achten Sie auf die Rückgabetypen:

julia> typeof(ab) 
DataArrays.DataArray{Int64,1} 

julia> typeof(bc) 
DataArrays.DataArray{Int64,1} 

julia> typeof(ac) 
DataArrays.DataArray{Int64,1} 

julia> typeof(max(ab, bc)) 
Array{Any,1} 

Das letzte ist das Problem. Julia beschwert sich, dass sie eine DataArray{Int64,1} mit einer Array{Any,1} nicht vergleichen kann. Dies passiert nicht mit den ursprünglichen Int Arrays, weil sie keine NA haben. Wie es in den DataFrames docs, NA Giften Array-Operationen erwähnt.

Beachten Sie, dass der folgende Code funktioniert gut, weil es keine NA hat, so dass der Rückgabetyp von max vollständig angegeben:

df2 = DataFrame(A = a, B = b, C = c) 
df2[:max] = max(a, b, c) 
typeof(df2[:max]) ### DataArrays.DataArray{Int64,1} 

Ihre beste Möglichkeit ist es, die NA von Ihrem DataFrame vor dem Berechnen von Maxima zurechnen oder spüle . Eine einfache Möglichkeit, NA by row zu löschen, ist

df3 = DataFrames.na_omit(df)[1] 
+0

Ist 'na_omit()' überall dokumentiert? Konnte es nicht sehen ... – daycaster

+1

nicht zu meinem Wissen. 'na_omit' wird nicht von 'DataFrames' exportiert. es ist immer noch in v0.8.5, obwohl sich das in Zukunft ändern kann –