Hi Elaine, In that case: Do you have "GID" in the "IslandA" and "IslandB"s?
IslandA<-c("GID 1", "GID 5") IslandB<- c("GID 2", "GID 4", "GID 7") If there is no change in the two "Islands", then using the same dataset: mat1<- as.matrix(read.table(text=" D0989 D9820 D5629 D4327 D2134 GID_1 1 0 0 1 0 GID_2 0 1 1 0 0 GID_4 0 0 1 0 0 GID_5 1 1 0 0 0 GID_7 0 1 0 0 1 ",sep="",header=TRUE)) row.names(mat1)<- gsub(".*\\_","",row.names(mat1)) #to replace the "GID_" from the row.names() mat1 # D0989 D9820 D5629 D4327 D2134 #1 1 0 0 1 0 #2 0 1 1 0 0 #4 0 0 1 0 0 #5 1 1 0 0 0 #7 0 1 0 0 1 IslandA<-c("GID 1", "GID 5") IslandB<- c("GID 2", "GID 4", "GID 7") res<-t(sapply(c("IslandA","IslandB"),function(x) {x1<- mat1[match(gsub(".*\\s+","",get(x)),row.names(mat1)),];(!!colSums(x1))*1})) res # D0989 D9820 D5629 D4327 D2134 #IslandA 1 1 0 1 0 #IslandB 0 1 1 0 1 Regarding the use of "!!colSums()" You can check these: t(sapply(c("IslandA","IslandB"),function(x) {x1<- mat1[match(gsub(".*\\s+","",get(x)),row.names(mat1)),];!colSums(x1)})) # D0989 D9820 D5629 D4327 D2134 #IslandA FALSE FALSE TRUE FALSE TRUE #IslandB TRUE FALSE FALSE TRUE FALSE t(sapply(c("IslandA","IslandB"),function(x) {x1<- mat1[match(gsub(".*\\s+","",get(x)),row.names(mat1)),];!!colSums(x1)})) # D0989 D9820 D5629 D4327 D2134 #IslandA TRUE TRUE FALSE TRUE FALSE #IslandB FALSE TRUE TRUE FALSE TRUE # "*1" will replace TRUE with 1 and FALSE with 0. A.K. ________________________________ From: Elaine Kuo <elaine.kuo...@gmail.com> To: arun <smartpink...@yahoo.com> Sent: Wednesday, July 31, 2013 6:58 PM Subject: Re: [R] merge matrix row data Dear Arun, Thank you for the clear explanation. The row.names question is a mistyping, for I do not have enough sleep last night. Two more questions 1. If the row names are 1, 2, and 4 etc (numbers) instead of GID 1, GID 2, and GID 3, is there any modification in need for the code ? 2. Please kindly explain the code (!!colSums(x1))*1} It is the critical part to merge the row data. Thanks again. Elaine On Thu, Aug 1, 2013 at 6:45 AM, arun <smartpink...@yahoo.com> wrote: Dear Elaine, > >I used that line only because you didn't provide the data using dput(). So, I >need to either use delimiter "," or just leave a "space" by first joining the >"GID" and the "numbers" using "_". I chose the latter as I didn't had that >much time to spent by putting "," between each entries. After that, I removed >"_" using the ?gsub(). As Bert pointed out, there are many online resources >for understanding regular expression. > >In this particular case, what I did was to single out the "_" in the first >pair of quotes, and replace with space in the second pair of quotes " ". >Therefore, "GID_1", would become "GID 1", which is what your original dataset >looks like. > >If you type row.names(mat1) on the R console and enter, you will be able to >get the output. > >Hope it helps. >Arun > > > > > > > > >________________________________ >From: Elaine Kuo <elaine.kuo...@gmail.com> >To: arun <smartpink...@yahoo.com> >Cc: R help <r-help@r-project.org> >Sent: Wednesday, July 31, 2013 5:07 PM >Subject: Re: [R] merge matrix row data > > > > >Dear Arun > >Thank you for the very useful help. >However, please kindly explain the code below. >row.names(mat1)<- gsub("[_]"," ",row.names(mat1)) > > >1. what does "[_]" mean? >2. what does " " mean? >3. what does row.names(mat1) mean? > >I checked ?gsub but still did not get the idea. > >Thank you again > >Elaine > > > >On Wed, Jul 31, 2013 at 9:35 PM, arun <smartpink...@yahoo.com> wrote: > >HI, >> >>Please use ?dput() >>mat1<- as.matrix(read.table(text=" >> >>D0989 D9820 D5629 D4327 D2134 >>GID_1 1 0 0 1 0 >>GID_2 0 1 1 0 0 >>GID_4 0 0 1 0 0 >>GID_5 1 1 0 0 0 >>GID_7 0 1 0 0 1 >>",sep="",header=TRUE)) >>row.names(mat1)<- gsub("[_]"," ",row.names(mat1)) >>IslandA<-c("GID 1", "GID 5") >>IslandB<- c("GID 2", "GID 4", "GID 7") >> res<- t(sapply(c("IslandA","IslandB"),function(x) >>{x1<-mat1[match(get(x),row.names(mat1)),];(!!colSums(x1))*1} )) >> >> res >># D0989 D9820 D5629 D4327 D2134 >>#IslandA 1 1 0 1 0 >>#IslandB 0 1 1 0 1 >>A.K. >> >> >> >> >> >>----- Original Message ----- >>From: Elaine Kuo <elaine.kuo...@gmail.com> >>To: "r-h...@stat.math.ethz.ch" <r-h...@stat.math.ethz.ch> >>Cc: >>Sent: Wednesday, July 31, 2013 9:03 AM >>Subject: [R] merge matrix row data >> >>Dear list, >> >> >> >>I have a matrix showing the species presence-absence on a map. >> >>Its rows are map locations, represented by GridCellID, such as GID1 and GID >>5. >> >>Its columns are species ID, such as D0989, D9820, and D5629. >> >>The matrix is as followed. >> >> >> >>Now I want to merge the GridCellID according to the map location of each >>island. >> >>For instance, Island A consist of GID 1 and 5. Island B consist of GID 2, >>4, and 7. >> >>In GID 1 and 5, species D0989 are both 1. >> >>Then I want to merge GID 1 and 5 into Island A, with species D0989 as 1. >> >>The original matrix and the resulting matrix are listed below. >> >>Please kindly advise how to code the calculation in R. >> >>Please do not hesitate to ask if anything is unclear. >> >>Thank you in advance. >> >> >> >>Elaine >> >> >> >>Original matrix >> >> D0989 D9820 D5629 D4327 D2134 >> >>GID 1 1 0 0 1 0 >> >>GID 2 0 1 1 0 0 >> >>GID 4 0 0 1 0 0 >> >>GID 5 1 1 0 0 0 >> >>GID 7 0 1 0 0 1 >> >> >> >>Resulting matrix >> >> D0989 D9820 D5629 D4327 D2134 >> >>Island A 1 1 0 1 0 >> >>Island B 0 1 1 0 1 >> >> [[alternative HTML version deleted]] >> >>______________________________________________ >>R-help@r-project.org mailing list >>https://stat.ethz.ch/mailman/listinfo/r-help >>PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>and provide commented, minimal, self-contained, reproducible code. >> >> > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.