menchelab / BioProfiling.jl

A flexible Julia toolkit for high-dimensional cellular profiles
MIT License
13 stars 1 forks source link

Cannot apply data transformation when some columns are not floats #30

Closed koalive closed 3 years ago

koalive commented 3 years ago

This was observed when logtransform! was applied on an Experiment with columns of type Int64:

InexactError: Int64(8.61323037961318)

Stacktrace: [1] Int64 at ./float.jl:710 [inlined] [2] convert at ./number.jl:7 [inlined] [3] setindex! at ./array.jl:847 [inlined] [4] setindex! at ./subarray.jl:298 [inlined] [5] _copyto_helper!(::SubArray{Int64,1,Array{Int64,1},Tuple{Array{Int64,1}},false}, ::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{2},Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},typeof(identity),Tuple{Base.Broadcast.Extruded{Array{Float64,2},Tuple{Bool,Bool},Tuple{Int64,Int64}}}}, ::Int64) at /opt/julia/packages/DataFrames/zXEKU/src/other/broadcasting.jl:143 [6] copyto!(::SubDataFrame{DataFrame,DataFrames.SubIndex{DataFrames.Index,Array{Int64,1},Array{Int64,1}},Array{Int64,1}}, ::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{2},Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},typeof(identity),Tuple{Array{Float64,2}}}) at /opt/julia/packages/DataFrames/zXEKU/src/other/broadcasting.jl:234 [7] materialize! at ./broadcast.jl:848 [inlined] [8] materialize!(::SubDataFrame{DataFrame,DataFrames.SubIndex{DataFrames.Index,Array{Int64,1},Array{Int64,1}},Array{Int64,1}}, ::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{2},Nothing,typeof(identity),Tuple{Array{Float64,2}}}) at ./broadcast.jl:845 [9] logtransform!(::Experiment) at /opt/julia/packages/BioProfiling/9G7jg/src/transform.jl:8

[11] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091 [12] execute_code(::String, ::String) at /opt/julia/packages/IJulia/rWZ9e/src/execute_request.jl:27 [13] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /opt/julia/packages/IJulia/rWZ9e/src/execute_request.jl:86 [14] #invokelatest#1 at ./essentials.jl:710 [inlined] [15] invokelatest at ./essentials.jl:709 [inlined] [16] eventloop(::ZMQ.Socket) at /opt/julia/packages/IJulia/rWZ9e/src/eventloop.jl:8 [17] (::IJulia.var"#15#18")() at ./task.jl:356

Current workaround: convert all selected columns to float.

for colname in names(getdata(exptransform))
    exptransform.data[!,colname] = float.(exptransform.data[:,colname])
end
koalive commented 3 years ago

Step 1: Check that all kept rows are numbers. Step 2: Convert everything to float Step 3: Apply transformation. Step 4: Mention in Docs that this converts data to float.

koalive commented 3 years ago

Implemented and stable since efc0b3195a31b92a3e5257f718ba22ea42babc25