which(df == 1, arr.ind=TRUE) is useful here:> df <- matrix(c(0,NA,0,0,0,1,1,1,0,0,1,0,0,0,NA), nrow=3) > df[,1] [,2] [,3] [,4] [,5] [1,] 0 0 1 0 0 [2,] NA 0 1 1 0 [3,] 0 1 0 0 NA> ## Identify (row,col) indices for 1:s > idxs <- which(df == 1, arr.ind=TRUE) > idxsrow col [1,] 3 2 [2,] 1 3 [3,] 2 3 [4,] 2 4> ## Drop any in the last column > idxs <- idxs[idxs[,"col"] < ncol(df), , drop=FALSE] > idxsrow col [1,] 3 2 [2,] 1 3 [3,] 2 3 [4,] 2 4> idxs[,"col"] <- idxs[,"col"] + 1L > idxsrow col [1,] 3 3 [2,] 1 4 [3,] 2 4 [4,] 2 5> df[idxs] <- 1 > df[,1] [,2] [,3] [,4] [,5] [1,] 0 0 1 1 0 [2,] NA 0 1 1 1 [3,] 0 1 1 0 NA /Henrik On Thu, Sep 22, 2016 at 8:13 PM, Jim Lemon <drjimlemon at gmail.com> wrote:> Hi Saba, > Try this: > > df<-matrix(c(0,NA,0,0,0,1,1,1,0,0,1,0,0,0,NA),nrow=3) > dimdf<-dim(df) > df1<-df==1 > df[cbind(rep(FALSE,dimdf[1]),df1[,-dimdf[2]])]<-1 > > Jim > > > > On Fri, Sep 23, 2016 at 12:27 PM, Saba Sehrish via R-help > <r-help at r-project.org> wrote: >> Hi >> >> I have a matrix that contains 1565 rows and 132 columns. All the observations are either "0" or "1". Now I want to keep all the observations same but just one change, i.e. whenever there is "1", the very next value in the same row should become "1". Please see below as a sample: >> >>>df >> >> 0 0 1 0 0 >> NA 0 1 1 0 >> 0 1 0 0 NA >> >> What I want is: >> >> >> 0 0 1 1 0 >> NA 0 1 1 1 >> 0 1 1 0 NA >> >> >> >> I shall be thankful for the reply. >> >> >> Saba >> >> ______________________________________________ >> 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. > > ______________________________________________ > 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.
Another approach using in-place replacement and thinking with matrix operations instead of vector operations: DF <- matrix( c( 0, 0, 1, 0, 0 , NA, 0, 1, 1, 0 , 0, 1, 0, 0, NA ) , byrow=TRUE , nrow=3 ) DF2 <- DF DF2[ , -1 ] <- ifelse( !is.na( DF[ , -ncol( DF ) ] ) & 1 == DF[ , -ncol( DF ) ] , 1 , DF[ , -1 ] ) On Thu, 22 Sep 2016, Henrik Bengtsson wrote:> which(df == 1, arr.ind=TRUE) is useful here: > >> df <- matrix(c(0,NA,0,0,0,1,1,1,0,0,1,0,0,0,NA), nrow=3) >> df > [,1] [,2] [,3] [,4] [,5] > [1,] 0 0 1 0 0 > [2,] NA 0 1 1 0 > [3,] 0 1 0 0 NA > >> ## Identify (row,col) indices for 1:s >> idxs <- which(df == 1, arr.ind=TRUE) >> idxs > row col > [1,] 3 2 > [2,] 1 3 > [3,] 2 3 > [4,] 2 4 > >> ## Drop any in the last column >> idxs <- idxs[idxs[,"col"] < ncol(df), , drop=FALSE] >> idxs > row col > [1,] 3 2 > [2,] 1 3 > [3,] 2 3 > [4,] 2 4 > >> idxs[,"col"] <- idxs[,"col"] + 1L >> idxs > row col > [1,] 3 3 > [2,] 1 4 > [3,] 2 4 > [4,] 2 5 > >> df[idxs] <- 1 >> df > [,1] [,2] [,3] [,4] [,5] > [1,] 0 0 1 1 0 > [2,] NA 0 1 1 1 > [3,] 0 1 1 0 NA > > /Henrik > > On Thu, Sep 22, 2016 at 8:13 PM, Jim Lemon <drjimlemon at gmail.com> wrote: >> Hi Saba, >> Try this: >> >> df<-matrix(c(0,NA,0,0,0,1,1,1,0,0,1,0,0,0,NA),nrow=3) >> dimdf<-dim(df) >> df1<-df==1 >> df[cbind(rep(FALSE,dimdf[1]),df1[,-dimdf[2]])]<-1 >> >> Jim >> >> >> >> On Fri, Sep 23, 2016 at 12:27 PM, Saba Sehrish via R-help >> <r-help at r-project.org> wrote: >>> Hi >>> >>> I have a matrix that contains 1565 rows and 132 columns. All the observations are either "0" or "1". Now I want to keep all the observations same but just one change, i.e. whenever there is "1", the very next value in the same row should become "1". Please see below as a sample: >>> >>>> df >>> >>> 0 0 1 0 0 >>> NA 0 1 1 0 >>> 0 1 0 0 NA >>> >>> What I want is: >>> >>> >>> 0 0 1 1 0 >>> NA 0 1 1 1 >>> 0 1 1 0 NA >>> >>> >>> >>> I shall be thankful for the reply. >>> >>> >>> Saba >>> >>> ______________________________________________ >>> 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. >> >> ______________________________________________ >> 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. > > ______________________________________________ > 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 The ..... ..... Go Live... DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k
I got the matrix time down by another factor of 4 tmp <- matrix(c(0,0,1,0,0, NA,0,1,1,0, 0,1,0,0,NA, 1,0,1,0,1), ## last item in row has value 1 byrow=TRUE, 4, 5) ## Jeff matrix DF2 <- DF <- tmp DF2[ , -1 ] <- ifelse( !is.na( DF[ , -ncol( DF ) ] ) & 1 == DF[ , -ncol( DF ) ] , 1 , DF[ , -1 ] ) DF2 ## system.time( for (i in 1:1000) { DF2[ , -1 ] <- ifelse( !is.na( DF[ , -ncol( DF ) ] ) & 1 == DF[ , -ncol( DF ) ] , 1 , DF[ , -1 ] ) }) ## user system elapsed ## 0.027 0.001 0.029 ## rmh matrix DF <- tmp DF[,-1][(DF[,-ncol(DF)] == 1)] <- 1 DF ## system.time( for (i in 1:1000) { DF[,-1][(DF[,-ncol(DF)] == 1)] <- 1 }) ## user system elapsed ## 0.007 0.000 0.006 On Fri, Sep 23, 2016 at 12:25 PM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:> Another approach using in-place replacement and thinking with matrix > operations instead of vector operations: > > DF <- matrix( c( 0, 0, 1, 0, 0 > , NA, 0, 1, 1, 0 > , 0, 1, 0, 0, NA ) > , byrow=TRUE > , nrow=3 ) > DF2 <- DF > DF2[ , -1 ] <- ifelse( !is.na( DF[ , -ncol( DF ) ] ) > & 1 == DF[ , -ncol( DF ) ] > , 1 > , DF[ , -1 ] > ) > > > On Thu, 22 Sep 2016, Henrik Bengtsson wrote: > >> which(df == 1, arr.ind=TRUE) is useful here: >> >>> df <- matrix(c(0,NA,0,0,0,1,1,1,0,0,1,0,0,0,NA), nrow=3) >>> df >> >> [,1] [,2] [,3] [,4] [,5] >> [1,] 0 0 1 0 0 >> [2,] NA 0 1 1 0 >> [3,] 0 1 0 0 NA >> >>> ## Identify (row,col) indices for 1:s >>> idxs <- which(df == 1, arr.ind=TRUE) >>> idxs >> >> row col >> [1,] 3 2 >> [2,] 1 3 >> [3,] 2 3 >> [4,] 2 4 >> >>> ## Drop any in the last column >>> idxs <- idxs[idxs[,"col"] < ncol(df), , drop=FALSE] >>> idxs >> >> row col >> [1,] 3 2 >> [2,] 1 3 >> [3,] 2 3 >> [4,] 2 4 >> >>> idxs[,"col"] <- idxs[,"col"] + 1L >>> idxs >> >> row col >> [1,] 3 3 >> [2,] 1 4 >> [3,] 2 4 >> [4,] 2 5 >> >>> df[idxs] <- 1 >>> df >> >> [,1] [,2] [,3] [,4] [,5] >> [1,] 0 0 1 1 0 >> [2,] NA 0 1 1 1 >> [3,] 0 1 1 0 NA >> >> /Henrik >> >> On Thu, Sep 22, 2016 at 8:13 PM, Jim Lemon <drjimlemon at gmail.com> wrote: >>> >>> Hi Saba, >>> Try this: >>> >>> df<-matrix(c(0,NA,0,0,0,1,1,1,0,0,1,0,0,0,NA),nrow=3) >>> dimdf<-dim(df) >>> df1<-df==1 >>> df[cbind(rep(FALSE,dimdf[1]),df1[,-dimdf[2]])]<-1 >>> >>> Jim >>> >>> >>> >>> On Fri, Sep 23, 2016 at 12:27 PM, Saba Sehrish via R-help >>> <r-help at r-project.org> wrote: >>>> >>>> Hi >>>> >>>> I have a matrix that contains 1565 rows and 132 columns. All the >>>> observations are either "0" or "1". Now I want to keep all the observations >>>> same but just one change, i.e. whenever there is "1", the very next value in >>>> the same row should become "1". Please see below as a sample: >>>> >>>>> df >>>> >>>> >>>> 0 0 1 0 0 >>>> NA 0 1 1 0 >>>> 0 1 0 0 NA >>>> >>>> What I want is: >>>> >>>> >>>> 0 0 1 1 0 >>>> NA 0 1 1 1 >>>> 0 1 1 0 NA >>>> >>>> >>>> >>>> I shall be thankful for the reply. >>>> >>>> >>>> Saba >>>> >>>> ______________________________________________ >>>> 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. >>> >>> >>> ______________________________________________ >>> 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. >> >> >> ______________________________________________ >> 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 The ..... ..... Go Live... > DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... > Live: OO#.. Dead: OO#.. Playing > Research Engineer (Solar/Batteries O.O#. #.O#. with > /Software/Embedded Controllers) .OO#. .OO#. rocks...1k > > > ______________________________________________ > 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.