HJ YAN
2013-Mar-06 02:33 UTC
[R] How to combine conditional argument and logical argument in R to create subset of data...
Dear R user I have data created using code below b<-matrix(2:21,nrow=4) b[,1:3]=NA b[4,2]=5 b[3,1]=6 Now the data is> b[,1] [,2] [,3] [,4] [,5] [1,] NA NA NA 14 18 [2,] NA NA NA 15 19 [3,] 6 NA NA 16 20 [4,] NA 5 NA 17 21 I want to keep data in column 4 greater than 15 and the value in column 1 & 2 either greater than 4 or is 'NA'. So I would like to have my outcome as below... [3,] 6 NA NA 16 20 [4,] NA 5 NA 17 21 I thought something like the code below gonna to work but it only returns the last row,e.g "NA 5 NA 17 21". ... bb<-b[which( (b[,2]>4 | b[,2]==NA) & (b[,1]>4 | b[,1]==NA) & b[,4]>15) ,]) Please could anyone help? Many thanks in advance HJ [[alternative HTML version deleted]]
arun
2013-Mar-06 04:36 UTC
[R] How to combine conditional argument and logical argument in R to create subset of data...
Hi, ?b[b[,4]>15 & (b[,1]>4|is.na(b[,1])) & (b[,2]>4|is.na(b[,2])),] ?# ?? [,1] [,2] [,3] [,4] [,5] #[1,]??? 6?? NA?? NA?? 16?? 20 #[2,]?? NA??? 5?? NA?? 17?? 21 A.K. ----- Original Message ----- From: HJ YAN <yhj204 at googlemail.com> To: r-help at r-project.org Cc: Sent: Tuesday, March 5, 2013 9:33 PM Subject: [R] How to combine conditional argument and logical argument in R to create subset of data... Dear R user I have data created using code below b<-matrix(2:21,nrow=4) b[,1:3]=NA b[4,2]=5 b[3,1]=6 Now the data is> b? ? ? ? [,1]? [,2]? [,3]? [,4]? [,5] [1,]? NA? NA? NA? 14? 18 [2,]? NA? NA? NA? 15? 19 [3,]? ? ? 6? NA? NA? 16? 20 [4,]? NA? ? 5? ? NA? ? 17? 21 I want to keep data in column 4 greater than 15 and the value in column 1 & 2 either greater than 4 or is 'NA'. So I would like to have my outcome as below... [3,]? 6? NA NA 16 20 [4,] NA 5 NA 17 21 I thought something like the code below gonna to work but it only returns the last row,e.g "NA 5 NA 17 21". ... bb<-b[which( (b[,2]>4 | b[,2]==NA) & (b[,1]>4 | b[,1]==NA) & b[,4]>15) ,]) Please could anyone help? Many thanks in advance HJ ??? [[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.
arun
2013-Mar-06 16:06 UTC
[R] How to combine conditional argument and logical argument in R to create subset of data...
Hi, No problem. V1<-rep(c(rep(111,5),rep(222,5),rep(333,5)),2) ?length(V1) #[1] 30 ?V2<- c(1:30) #should be the same length as V1 Tem1<- cbind(V1,V2) Tem2<-Tem1[1:20,] Tem1[!Tem1[,2]%in%Tem2[,2],] ?# ???? V1 V2 ?#[1,] 222 21 ?#[2,] 222 22 ?#[3,] 222 23 ?#[4,] 222 24 ?#[5,] 222 25 ?#[6,] 333 26 ?#[7,] 333 27 ?#[8,] 333 28 ?#[9,] 333 29 #[10,] 333 30 #or subset(Tem1,!V2%in% Tem2[,2]) #or ?Tem1[is.na(match(Tem1[,2],Tem2[,2])),] ?# ???? V1 V2 ?#[1,] 222 21 ?#[2,] 222 22 ?#[3,] 222 23 ?#[4,] 222 24 ?#[5,] 222 25 ?#[6,] 333 26 ?#[7,] 333 27 ?#[8,] 333 28 ?#[9,] 333 29 #[10,] 333 30 A.K. ________________________________ From: HJ YAN <yhj204 at googlemail.com> To: arun <smartpink111 at yahoo.com> Sent: Wednesday, March 6, 2013 10:33 AM Subject: Re: [R] How to combine conditional argument and logical argument in R to create subset of data... Thank you SO MUCH Arun!!!? That's brilliant-- I've learnt some very useful new R command now, e.g. 'do.call' and 'split'. And I see where my code went wrong now.? ?I do appreciate greatly for your prompt reply. Also, I wonder if there exist a package can find difference between two data frames, e.g. one is a subset of the other? e.g.? ?V1<-rep(c(rep(111,5),rep(222,5),rep(333,5)),2) ?V2<-c(1:23) Tem1<-cbind(V1,V2) Tem2<-Tem1[1:20,] How do I get outcome like? [21,] 333 21 [22,] 333 22 [23,] 333 23 P.S. I used 'setdiff' before, but seems it only works for vectors but not for dataframe?? Sorry for so many questions today, as I'm coding for a work deadline tonight. Many thanks! Cheers HJ On Wed, Mar 6, 2013 at 1:55 PM, arun <smartpink111 at yahoo.com> wrote: Hi,>You can also try this: >?Tem3<- list() >?for(i in unique(Tem1[,1])) { >?Tem3[[i]]<- subset(Tem1,Tem1[,1]==i) >?Tem4<- do.call(rbind,Tem3) >?} >head(Tem4) >#????? V1 V2 >#[1,] 111? 1 >#[2,] 111? 2 >#[3,] 111? 3 >#[4,] 111? 4 >#[5,] 111 13 >#[6,] 111 14 > > >#or >Tem3<-c(NA,NA) >?for(i in unique(Tem1[,1])) { >?Tem2<- subset(Tem1, Tem1[,1]==i) >?Tem3<- rbind(Tem3,Tem2) >?Tem5<- Tem3[-1,] >?} >head(Tem5) >#? V1 V2 ># 111? 1 ># 111? 2 ># 111? 3 ># 111? 4 ># 111 13 ># 111 14 > >A.K. > > >________________________________ >From: HJ YAN <yhj204 at googlemail.com> > >To: arun <smartpink111 at yahoo.com> >Cc: r-help at r-project.org >Sent: Wednesday, March 6, 2013 8:24 AM >Subject: Re: [R] How to combine conditional argument and logical argument in R to create subset of data... > > > >Hi Arun > > >Thank you so much for the help, that's really helpful!! > >Also I have a quick question about the code below where I can not see why it doesn't work... > >I know the I shou > >V1<-c(rep(111,4),rep(222,4),rep(333,4),rep(111,4),rep(222,4),rep(333,3)) >V2<-c(1:23) >Tem1<-cbind(V1,V2) > > >So Tem 1 looks like... >> Tem1 >? ? ? ?V1 V2 >?[1,] 111 ?1 >?[2,] 111 ?2 >?[3,] 111 ?3 >?[4,] 111 ?4 >?[5,] 222 ?5 >?[6,] 222 ?6 >?[7,] 222 ?7 >?[8,] 222 ?8 >?[9,] 333 ?9 >[10,] 333 10 >[11,] 333 11 >[12,] 333 12 >[13,] 111 13 >[14,] 111 14 >[15,] 111 15 >[16,] 111 16 >[17,] 222 17 >[18,] 222 18 >[19,] 222 19 >[20,] 222 20 >[21,] 333 21 >[22,] 333 22 >[23,] 333 23 > >I would like the outcome to be... > >? ? ? V1 V2 > >? ? ?111 ?1 >? ? ?111 ?2 >? ? ?111 ?3 >? ? ?111 ?4 >? ? ?111 13 >? ? ?111 14 >? ? ?111 15 >? ? ?111 16 >? ? ?222 ?5 >? ? ?222 ?6 >? ? ?222 ?7 >? ? ?222 ?8 >? ? ?222 17 >? ? ?222 18 >? ? ?222 19 >? ? ?222 20 >? ? ?333 ?9 >? ? ?333 10 >? ? ?333 11 >? ? ?333 12 >? ? ?333 21 >? ? ?333 22 >? ? ?333 23 > > >So I tried code as below? >------------------------------------------ >Tem3<-c(NA,NA) >for(i in length(unique(Tem1[,1]))){ >Tem2<-subset(Tem1,Tem1[,1]==unique(Tem1[,1])[i]) >Tem3<-rbind(Tem3,Tem2) >Tem3 >} >Tem4<-Tem3[-1,] >--------------------------------------- > >And only get this... > > >?V1 V2 >?333 ?9 >?333 10 >?333 11 >?333 12 >?333 21 >?333 22 >?333 23 > > >I tried to run the code step by step, e.g. letting i=1, then i=2, then i= 3, and updating my Tem3, I did get what I wanted, but wondered why in the loop above it did not work...?? > > >Many thanks in advance! > >HJ > > > > > > > > > > > > > > > >On Wed, Mar 6, 2013 at 4:36 AM, arun <smartpink111 at yahoo.com> wrote: > >Hi, >> >>?b[b[,4]>15 & (b[,1]>4|is.na(b[,1])) & (b[,2]>4|is.na(b[,2])),] >>?# ?? [,1] [,2] [,3] [,4] [,5] >>#[1,]??? 6?? NA?? NA?? 16?? 20 >>#[2,]?? NA??? 5?? NA?? 17?? 21 >>A.K. >> >> >> >>----- Original Message ----- >>From: HJ YAN <yhj204 at googlemail.com> >>To: r-help at r-project.org >>Cc: >>Sent: Tuesday, March 5, 2013 9:33 PM >>Subject: [R] How to combine conditional argument and logical argument in R to create subset of data... >> >>Dear R user >> >>I have data created using code below >> >>b<-matrix(2:21,nrow=4) >>b[,1:3]=NA >>b[4,2]=5 >>b[3,1]=6 >> >>Now the data is >> >>> b >>? ? ? ? ?[,1]? [,2]? ?[,3]? [,4]? [,5] >>[1,]? ?NA? ?NA? ?NA? ?14? ?18 >>[2,]? ?NA? ?NA? ?NA? ?15? ?19 >>[3,]? ? ? 6? ?NA? ?NA? ?16? ?20 >>[4,]? ?NA? ? 5? ? ?NA? ? 17? ?21 >> >> >>I want to keep data in column 4 greater than 15 and the value in column 1 & >>2 either greater than 4 or is 'NA'. So I would like to have >>my outcome as below... >> >>[3,]? ?6? ?NA NA 16 20 >>[4,] NA 5 NA 17 21 >> >>I thought something like the code below gonna to work but it only returns >>the last row,e.g "NA 5 NA 17 21". ... >> >>bb<-b[which( (b[,2]>4 | b[,2]==NA) & (b[,1]>4 | b[,1]==NA) & b[,4]>15) ,]) >> >> >>Please could anyone help? >> >>Many thanks in advance >> >>HJ >> >>??? [[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. >> >>? ??? >