Bert Gunter
2017-Apr-29 16:53 UTC
[R] Matrix-list table conversion+nrwos with specefic values.
I am not a private (or free!) consultant. Post to the r-help if your question concerns R. -- Bert Bert Gunter On Sat, Apr 29, 2017 at 8:51 AM, abo dalash <abo_dlsh at hotmail.com> wrote:> Hi dear Bert > > > I'm trying to identify number of rows containing 2 specific values. > > I tried : which(mydata == 566,235), but this returns logical values for all > rows and any T in a certain row indicates the existence of one of these > values but what I need to know is only number of rows in my data set with > these 2 particular values considering these two values > > as one pair per row. For example : > > > 1 123 566 235 > > 2 443 54 566 > > 3 566 44 235 > > > here number of rows with the values 566&235 is 2 which are > > rows 1 & 3. Row 2 has only 566 so it should not be included in > > our calculation. > > > I also have a large matrix and wanted to convert it into a table so I can > > easily identify the combination with higher frequencies. > > > The matrix looks like this: > > > x y z > > x 0 5 67 > > y na 0 23 > > z na na 0 > > > and I would like to convert this into a table arranged with > > higher values first like this : > > x z 67 > > y z 23 > > x y 5 > > x x 0 > > y y 0 > > z z 0 > > y x na > > z x na > > z y na > > > Is there a simple function to perform this conversion with some explanation > about the Syntax if you don't mind? > > > Regards
Jeff Newmiller
2017-Apr-29 19:11 UTC
[R] Matrix-list table conversion+nrwos with specefic values.
Break it down. If you have a scalar value val and you want to know if it is in a
vector vec, using val==vec gets you a logical vector as long as vec. You can use
val %in% vec and you get a logical vector as long as val (e.g. 1). If val is a
vector of, say, length 2, then you will get a length 2 logical vector. In your
example, c(566,23) %in% c(123, 566, 235) would be c( TRUE, TRUE ). Since you
want both of these elements to be TRUE, you can use the all() function as in
all( c(566,23) %in% c(123, 566, 235) ). So use the apply function to examine
each row as a vector and you have it:
apply( mat, 1, function(v) { all( c( 566,235) %in% v ) } )
Note that this only works if your data are integers (see FAQ 7.31).
Re the matrix to table... use expand.grid and matrix indexing.
tbl <- expand.grid( r = seq.int( nrow( mat ) )
, c = seq.int( ncol( mat ) ) )
tbl$val <- mat[ as.matrix( tbl[ , c( "r","c" ) ] ) ]
tbl[ order( tbl$val, decreasing=TRUE), ]
--
Sent from my phone. Please excuse my brevity.
On April 29, 2017 9:53:08 AM PDT, Bert Gunter <bgunter.4567 at gmail.com>
wrote:>I am not a private (or free!) consultant. Post to the r-help if your
>question concerns R.
>
>-- Bert
>
>Bert Gunter
>
>
>
>On Sat, Apr 29, 2017 at 8:51 AM, abo dalash <abo_dlsh at hotmail.com>
>wrote:
>> Hi dear Bert
>>
>>
>> I'm trying to identify number of rows containing 2 specific values.
>>
>> I tried : which(mydata == 566,235), but this returns logical values
>for all
>> rows and any T in a certain row indicates the existence of one of
>these
>> values but what I need to know is only number of rows in my data set
>with
>> these 2 particular values considering these two values
>>
>> as one pair per row. For example :
>>
>>
>> 1 123 566 235
>>
>> 2 443 54 566
>>
>> 3 566 44 235
>>
>>
>> here number of rows with the values 566&235 is 2 which are
>>
>> rows 1 & 3. Row 2 has only 566 so it should not be included in
>>
>> our calculation.
>>
>>
>> I also have a large matrix and wanted to convert it into a table so I
>can
>>
>> easily identify the combination with higher frequencies.
>>
>>
>> The matrix looks like this:
>>
>>
>> x y z
>>
>> x 0 5 67
>>
>> y na 0 23
>>
>> z na na 0
>>
>>
>> and I would like to convert this into a table arranged with
>>
>> higher values first like this :
>>
>> x z 67
>>
>> y z 23
>>
>> x y 5
>>
>> x x 0
>>
>> y y 0
>>
>> z z 0
>>
>> y x na
>>
>> z x na
>>
>> z y na
>>
>>
>> Is there a simple function to perform this conversion with some
>explanation
>> about the Syntax if you don't mind?
>>
>>
>> Regards
>
>______________________________________________
>R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>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.
Jeff Newmiller
2017-Apr-29 22:15 UTC
[R] Matrix-list table conversion+nrwos with specefic values.
Please use reply-all to make sure the mailing list is included so others can learn from the discussion. Yes, you can use row and column names. Have you tried it? -- Sent from my phone. Please excuse my brevity. On April 29, 2017 2:44:06 PM PDT, abo dalash <abo_dlsh at hotmail.com> wrote:>Many thanks Jeff for your rapid response. > > >Reg. the first task, I will discuss this later with you as I have faced >some issues. > > >Your guidance reg. Matrix-Table conversion has produced the table I >want. > >thank you so much. My matrix is of size 120*120 and the headers of the >columns and rows contain the same list of drug names. The table I >produced > >contains the number of rows and number of columns in the matrix under > >r and c columns in my produced table. Is it possible to have names of >drugs > >in my table instead of the number of row or number of column of the >matrix. > >Please let me know if this is not clear. > > >Many thanks > > >________________________________ >From: Jeff Newmiller <jdnewmil at dcn.davis.ca.us> >Sent: 29 April 2017 10:11 PM >To: r-help at r-project.org; Bert Gunter; abo dalash; R-help >Subject: Re: [R] Matrix-list table conversion+nrwos with specefic >values. > >Break it down. If you have a scalar value val and you want to know if >it is in a vector vec, using val==vec gets you a logical vector as long >as vec. You can use val %in% vec and you get a logical vector as long >as val (e.g. 1). If val is a vector of, say, length 2, then you will >get a length 2 logical vector. In your example, c(566,23) %in% c(123, >566, 235) would be c( TRUE, TRUE ). Since you want both of these >elements to be TRUE, you can use the all() function as in all( >c(566,23) %in% c(123, 566, 235) ). So use the apply function to examine >each row as a vector and you have it: > >apply( mat, 1, function(v) { all( c( 566,235) %in% v ) } ) > >Note that this only works if your data are integers (see FAQ 7.31). > >Re the matrix to table... use expand.grid and matrix indexing. > >tbl <- expand.grid( r = seq.int( nrow( mat ) ) > , c = seq.int( ncol( mat ) ) ) >tbl$val <- mat[ as.matrix( tbl[ , c( "r","c" ) ] ) ] >tbl[ order( tbl$val, decreasing=TRUE), ] > >-- >Sent from my phone. Please excuse my brevity. > >On April 29, 2017 9:53:08 AM PDT, Bert Gunter <bgunter.4567 at gmail.com> >wrote: >>I am not a private (or free!) consultant. Post to the r-help if your >>question concerns R. >> >>-- Bert >> >>Bert Gunter >> >> >> >>On Sat, Apr 29, 2017 at 8:51 AM, abo dalash <abo_dlsh at hotmail.com> >>wrote: >>> Hi dear Bert >>> >>> >>> I'm trying to identify number of rows containing 2 specific values. >>> >>> I tried : which(mydata == 566,235), but this returns logical values >>for all >>> rows and any T in a certain row indicates the existence of one of >>these >>> values but what I need to know is only number of rows in my data set >>with >>> these 2 particular values considering these two values >>> >>> as one pair per row. For example : >>> >>> >>> 1 123 566 235 >>> >>> 2 443 54 566 >>> >>> 3 566 44 235 >>> >>> >>> here number of rows with the values 566&235 is 2 which are >>> >>> rows 1 & 3. Row 2 has only 566 so it should not be included in >>> >>> our calculation. >>> >>> >>> I also have a large matrix and wanted to convert it into a table so >I >>can >>> >>> easily identify the combination with higher frequencies. >>> >>> >>> The matrix looks like this: >>> >>> >>> x y z >>> >>> x 0 5 67 >>> >>> y na 0 23 >>> >>> z na na 0 >>> >>> >>> and I would like to convert this into a table arranged with >>> >>> higher values first like this : >>> >>> x z 67 >>> >>> y z 23 >>> >>> x y 5 >>> >>> x x 0 >>> >>> y y 0 >>> >>> z z 0 >>> >>> y x na >>> >>> z x na >>> >>> z y na >>> >>> >>> Is there a simple function to perform this conversion with some >>explanation >>> about the Syntax if you don't mind? >>> >>> >>> Regards >> >>______________________________________________ >>R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>https://stat.ethz.ch/mailman/listinfo/r-help > >R-help -- Main R Mailing List: Primary help - Homepage - >SfS<https://stat.ethz.ch/mailman/listinfo/r-help> >stat.ethz.ch >The main R mailing list, for announcements about the development of R >and the availability of new code, questions and answers about problems >and solutions using R ... > > > >>PLEASE do read the posting guide >>http://www.R-project.org/posting-guide.html >>and provide commented, minimal, self-contained, reproducible code.