当我尝试检索DataFrame中列的最大差异时,我收到错误。有什么问题?
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:没有方法匹配无效(:: DataArrays.DataArray {Int64,1},:: Array {Any,1})
执行df[:max] = max(ab, bc)
或df[:max] = max(a, b, c)
的最大值可按预期工作。
有人可以澄清一下发生了什么吗?谢谢!
答案 0 :(得分:2)
注意返回类型:
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}
最后一个是问题。 Julia抱怨无法将DataArray{Int64,1}
与Array{Any,1}
进行比较。原始Int
数组不会发生这种情况,因为它们没有NA
。正如DataFrames
docs,NA
毒药阵列操作中所述。
观察到以下代码正常,因为它没有NA
,因此完全指定了max
的返回类型:
df2 = DataFrame(A = a, B = b, C = c)
df2[:max] = max(a, b, c)
typeof(df2[:max]) ### DataArrays.DataArray{Int64,1}
您最好的选择是在计算最大值之前从NA
计算或清除DataFrame
。按行清除NA
的简便方法是
df3 = DataFrames.na_omit(df)[1]