Skip to content
Prev 316202 / 398506 Next

Removal of columns from matrix where all values of the column are identical.

HI Ben,

Sorry, I didn't test it at that time to different cases.
testm[,apply(testm,2,function(x) all(c(TRUE,x[-length(x)]!=x[-1])))]
x[-length(x)] #removes the last observation in each column
x[-1] #removes the first observation in each column
#and compares them for each column.

If I change the code a bit, it should work:
testm[,apply(testm,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))]
?# ?? [,1] [,2] [,3] [,4]
#[1,]??? 1??? 3??? 5??? 1
#[2,]??? 2??? 3??? 4??? 2
#[3,]??? 3??? 3??? 3??? 3
#[4,]??? 4??? 4??? 2??? 4
#[5,]??? 5??? 3??? 1??? 4

#Changing your dataset:


testm1<-matrix(nrow=5, ncol=5)
testm1[,1] <- c(1,2,3,4,5)
testm1[,2] <- c(3,3,3,3,3)
testm1[,3] <- c(3,3,4,4,3)
testm1[,4] <- c(5,4,3,2,1)
testm1[,5] <- c(2,2,3,4,4)
testm1[,apply(testm1,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))]
#???? [,1] [,2] [,3] [,4]
#[1,]??? 1??? 3??? 5??? 2
#[2,]??? 2??? 3??? 4??? 2
#[3,]??? 3??? 4??? 3??? 3
#[4,]??? 4??? 4??? 2??? 4
#[5,]??? 5??? 3??? 1??? 4
set.seed(15)
testm2<-matrix(c(sample(letters[1:5],20,replace=TRUE),rep("a",5)),ncol=5)
testm2[,apply(testm2,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))]
?# ?? [,1] [,2] [,3] [,4]
#[1,] "d"? "e"? "a"? "e" 
#[2,] "a"? "e"? "d"? "c" 
#[3,] "e"? "b"? "c"? "e" 
#[4,] "d"? "d"? "d"? "a" 
#[5,] "b"? "e"? "e"? "d" 


A.K.



----- Original Message -----
From: Benjamin Ward (ENV) <B.Ward at uea.ac.uk>
To: arun <smartpink111 at yahoo.com>
Cc: R help <r-help at r-project.org>
Sent: Saturday, January 26, 2013 8:37 AM
Subject: RE: [R] Removal of columns from matrix where all values of the column are identical.

Hi,

I've been trying to work this out how it works, I'm still not totally sure but seems to me it subsets the matrix according to whether each column returns all TRUE, to not being the same values when you compare the column[-1] and the column[-length(column)], essentially siding the column against itself and making comparison? It seems that it also removed columns with any repeated values, rather than columns in which all values are the same:

testm<-matrix(nrow=5, ncol=5)
testm[,1] <- c(1,2,3,4,5)
testm[,2] <- c(3,3,3,3,3)
testm[,3] <- c(3,3,4,4,3)
testm[,4] <- c(5,4,3,2,1)
testm[,5] <- c(2,2,3,4,4)
testm

test3 <- testm[,apply(testm,2,function(x) all(c(TRUE,x[-length(x)]!=x[-1])))]
test3

test3
? ? ?[,1] [,2]
[1,] ? ?1 ? ?5
[2,] ? ?2 ? ?4
[3,] ? ?3 ? ?3
[4,] ? ?4 ? ?2
[5,] ? ?5 ? ?1

Thanks,
Ben W.