Home > Net >  Why one element of SubString Vector can not be tested into conditional evaluation if (Julia)?
Why one element of SubString Vector can not be tested into conditional evaluation if (Julia)?

Time:05-17

I want to create a function in which, first, it filters one element of a dataframe in Julia. Second, it tests if the element is "missing". If the answer is rue, it return the value "0.0". My issue is that the control evaluation "if" does not work and I don t know why. If the element is "String" the control evaluation works, however, the element is a 1-element Vector{SubString{String}}: after filtering; thus, the control evaluation does not work. I would like to know why and it is possible to turn the vector element into a string object. Note: "isequal", '==', '===' do not work either.

For example:

example_ped = DataFrame(animal = collect(1:1:11),
                    sire = [fill(0,5); fill(4,3); fill(5,3)],
                    dam = [fill(0,4); fill(2,4); fill(3,3)])
CSV.write("ped_example.txt",example_ped, header=true,delim='\t')
pedi = CSV.read("ped_example.txt",delim = '\t', header=true, missingstrings=["0"], DataFrame)
pedi[!,1]=strip.(string.(pedi[!,1]))
pedi[!,2]=strip.(string.(pedi[!,2]))
pedi[!,3]=strip.(string.(pedi[!,3]))

Part of the function

function computAddRel!(ped,animal_1,animal_2)
elder,recent = animal_1 < animal_2 ? (animal_1,animal_2) : (animal_2,animal_1)
sireOfrecent = ped.sire[ped.animal.==recent]
damOfrecent  = ped[ped.animal.==recent,"dam"]
if elder==recent
    f_inbreed = (sireOfrecent=="missing" || damOfrecent=="missing") ? 0.0 : 0.5*computAddRel!(ped,sireOfrecent,damOfrecent)
    adiv = 1.0   f_inbreed
    return adiv
end
end

if the animal_1 and animal_2 are equal to 5

julia>     sireOfrecent = pedi.sire[pedi.animal.==recent]
1-element Vector{Union{Missing, Int64}}:
 missing

However, the control evaluation is false

julia> sireOfrecent=="missing"
false
julia> isequal(sireOfrecent,"missing")
false

Thank in advance for your time.

CodePudding user response:

You should write:

ismissing(only(sireOfrecent))

The meaning of this:

  • only checks if you picked exactly one row (if not - you will get an error, as then there is ambiguity; if yes - you extract out the element from an array)
  • ismissing is a function that you should use to check if some value is missing.

Here are some examples:

julia> x = [missing]
1-element Vector{Missing}:
 missing

julia> only(x)
missing

julia> ismissing(only(x))
true

julia> only([1, 2])
ERROR: ArgumentError: Collection has multiple elements, must contain exactly 1 element

julia> ismissing(only([1]))
false
  • Related