[R] merge matrix row data
arun
smartpink111 at yahoo.com
Thu Aug 1 01:15:45 CEST 2013
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.tw at gmail.com>
To: arun <smartpink111 at 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 <smartpink111 at 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.tw at gmail.com>
>To: arun <smartpink111 at yahoo.com>
>Cc: R help <r-help at 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 <smartpink111 at 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.tw at gmail.com>
>>To: "r-help at stat.math.ethz.ch" <r-help at 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 at 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.
>>
>>
>
More information about the R-help
mailing list