Filterslices or selectslices

Are there functions like filterslices or selectslices to do the below.

X =[
        1   1       1       1 
        1   missing 1       1 
        1   missing missing 1
        1   1       1       missing
    ]

i = mapslices( x-> count(ismissing,x) ≤1, X , dims=1)[1,:]
X[:,i]


#something like this to do the above
filterslices( x-> count(ismissing,x) ≤1, X, dims=1 )

Maybe these are slightly more readable?

stack(filter(x->count(ismissing,x)<=1, eachcol(X)))

stack(x for x in eachcol(X) if count(ismissing,x)<=1)  # Iterators.filter
3 Likes

other possibility:

X[:,findall(x-> count(ismissing,x)<=1,eachcol(X))]

and this too (although not very beautiful and efficient)

[filter(x-> count(ismissing,x)<=1,eachcol(X))... ;;]

1 Like
using AccessorsExtra

@modify(eachcol(X)) do cols
    filter(x -> count(ismissing, x) ≤ 1, cols)
end

works with eachrow and eachslice as well, not just eachcol.

2 Likes

Thanks all. Very useful
Its actually cleaner with a KeyedArray

X = KeyedArray( [
    #b1           #b2
    1;1;0;1;;     1;0;1;1;;;        #c1
    1;0;1;1;;     1;1;1;1;;;        #c2
    1;1;0;1;;     1;1;1;1           #c3
], a=1:4, b=[:b1,:b2], c=[:c1,:c2,:c3] )

X(c = [i for i in X.c if count(iszero, X(c=i)) ≤ 1 ]  )
1 Like