Question

Below is my code

### makes indiviual matrix of data ##
#####READ IN FILES##########
one<-matrix(c(2001,2002,2003,2004,23456, 23567,54321,12345),4,2);
two<-matrix(c(54321,23567,23456,12345,1234,2345,3456,7777),4,2);
three<-matrix(c(3456,7777,2345,1234,5677,6789,6678,6767),4,2);
four<-matrix(c(6678,5677,6767,5555,1111,1112),4,2);
 five<-matrix(c(5555,1112,1111,2222,1212,9999),4,2);
## order all data by second column and spit out NAs if number in second column of 
## previous matrix  doesnt match first column of new matrix
onea<-one[order(one[,2]),];
twoa<-two[order(two[,1])[rank(onea[,2])],];
threea<-three[order(three[,1])[rank(twoa[,2])],]
foura<-four[order(four[,1])[rank(threea[,2])],]
fivea<-five[order(five[,1])[rank(foura[,2])],]
finaltable<-cbind(onea,twoa,threea,foura,fivea)

These are the warning messages I am getting:

Warning message:
In matrix(c(6678, 5677, 6767, 5555, 1111, 1112), 4, 2) :
  data length [6] is not a sub-multiple or multiple of the number of rows [4]
>     five<-matrix(c(5555,1112,1111,2222,1212,9999),4,2);
Warning message:
In matrix(c(5555, 1112, 1111, 2222, 1212, 9999), 4, 2) :
  data length [6] is not a sub-multiple or multiple of the number of rows [4]

What I want to do is this, when I order(four[,1]) from the rank of threea[,2] I have a missing value. whenever a number in threea[,2] no longer is found in foura[,1], I want it to say NA across from that number. below is what I want it to say. I need this to be pretty automated if possible. Also, The NA value needs to be able to be throughout table without affecting other numbers matching each other.

finaltable
     [,1]  [,2]  [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 2004 12345 12345 7777 7777 6789 NA     NA   NA    NA
[2,] 2001 23456 23456 3456 3456 5677 5677 1111 1111  8888
[3,] 2002 23567 23567 2345 2345 6678 6678 5555 5555  2222
[4,] 2003 54321 54321 1234 1234 6767 6767 1112 1112  9999
Was it helpful?

Solution

This question is pretty unclear. I am only able to follow because you asked a similar question yesterday which I remember. Hopefully this answers your question.

First of all, you are creating your matrices incorrectly. What (I think) you actually want for four and five is this:

four<-matrix(c(6678,5677,6767,5555,1111,1112),3,2)
five<-matrix(c(5555,1112,1111,2222,1212,9999),3,2)

Your second problem can be solved like this:

 matchOrder<-function(x,y){
   y[match(x[,2],y[,1]),]
 }
 onea <- one[order(one[,2]),]
 twoa <- matchOrder(onea,two)
 threea <- matchOrder(twoa,three)
 foura <- matchOrder(threea,four)
 fivea <- matchOrder(foura,five)
 finaltable <- cbind(onea,twoa,threea,foura,fivea)
 finaltable
     [,1]  [,2]  [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 2004 12345 12345 7777 7777 6789   NA   NA   NA    NA
[2,] 2001 23456 23456 3456 3456 5677 5677 1111 1111  9999
[3,] 2002 23567 23567 2345 2345 6678 6678 5555 5555  2222
[4,] 2003 54321 54321 1234 1234 6767 6767 1112 1112  1212

In fact, what you really want to do is put these matrices in a list, and do this all with one call:

l <- list(two,three,four,five)
do.call(cbind,Reduce(matchOrder,l,onea,accumulate=T))
     [,1]  [,2]  [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 2004 12345 12345 7777 7777 6789   NA   NA   NA    NA
[2,] 2001 23456 23456 3456 3456 5677 5677 1111 1111  9999
[3,] 2002 23567 23567 2345 2345 6678 6678 5555 5555  2222
[4,] 2003 54321 54321 1234 1234 6767 6767 1112 1112  1212
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top