# 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