[R] putting NAs at the end

Angel angel_lul at hotmail.com
Mon Aug 18 13:13:35 CEST 2003


Thanks to Gabor and others I've found the solution to my problem, but there
are some issues
with order, sort and apply that I post in another thread.
Here are two solutions to my problem:
# Example matrix:
A<-matrix(rnorm(10000*12),nrow=10000,ncol=12)
A[rbind(c(100,3),c(90,9),c(40,6))]<-NA

# Solution given by GaborGrothendieck
system.time({A.a<-t(apply(A,1,function(x){x<-matrix(x,nr=3);x[,order(colSums
(is.na(x))>0)]}))})

# A function I wrote with various suggestions (Petr Pikal, Duncan Murdoch,
Ted Harding)

Put.NaN.last<-function(A) {
# First creates a matrix where the points with NA z have also NA
# x and y
A.o<-A
A.o[,1:3]<-A.o[,1:3]*A[,3]/A[,3]
A.o[,4:6]<-A.o[,4:6]*A[,6]/A[,6]
A.o[,7:9]<-A.o[,7:9]*A[,9]/A[,9]
A.o[,10:12]<-A.o[,10:12]*A[,12]/A[,12]
# Transposes both matrix as I want to order each row (by column) and R is
# by default "column-major order"
A<-t(A)
A.o<-t(A.o)
# Now makes another matrix Ind with same dim as A but
# where the integer part of each element indicates the row (original A
columns)
# and the second decimal indicates the column (original A row, i.e A is now
transposed)
serie<-rep(1:4,each=3)/10
serie<-rep(serie,ncol(A))
Ind<-rep(1:ncol(A),each=nrow(A))
Ind<-Ind+serie
# Adds 0.5 to the elements where A.o is NA so they will be larger
# than any in the row
Ind[which(is.na(A.o))]<-Ind[which(is.na(A.o))]+0.5
# Finally order A according to the Ind
# this avoids having to use apply
A.o[,]<-A[order(Ind)]
A.o<-t(A.o)
A<-t(A)
return(A.o)
}

system.time({A.put<-Put.NaN.last(A)})

# As you see calling with my function is much faster than the apply
# I've decided to post another thread to try to understand what is going on
here
# Thanks to all that helped
# Angel




More information about the R-help mailing list