Hi Camilo, Glad it worked well.
You mentioned replacing zeros with 1s. You can use the same function, replace NA by 1. dat4<-ifelse(sapply(dat3,length)==0,1,dat3) A.K. ----- Original Message ----- From: Camilo Mora <cm...@dal.ca> To: arun <smartpink...@yahoo.com> Cc: Sent: Wednesday, July 25, 2012 1:15 AM Subject: Re: First value in a row Thanks Arun, Your funbction is the most promising. I am trying to replace Zeros with 1s and see it that works. I have this script within a loop so I can not replace by hand NAs C Camilo Mora, Ph.D. Department of Geography, University of Hawaii Currently available in Colombia Phone: Country code: 57 Provider code: 313 Phone 776 2282 From the USA or Canada you have to dial 011 57 313 776 2282 http://www.soc.hawaii.edu/mora/ Quoting arun <smartpink...@yahoo.com>: > Hi Camilo, > > I hope the second solution in my last email works for you. > A.K. > > > > ----- Original Message ----- > From: Camilo Mora <cm...@dal.ca> > To: arun <smartpink...@yahoo.com> > Cc: > Sent: Tuesday, July 24, 2012 11:30 PM > Subject: Re: First value in a row > > Hi Arun, > > It works partially.... your script skip those rows full of NAs causing a > different vector size, which then prevents merging the results to the > original database. Any way to keep rows with all NAs? > > C > > > Camilo Mora, Ph.D. > Department of Geography, University of Hawaii > Currently available in Colombia > Phone: Country code: 57 > Provider code: 313 > Phone 776 2282 > From the USA or Canada you have to dial 011 57 313 776 2282 > http://www.soc.hawaii.edu/mora/ > > > > Quoting arun <smartpink...@yahoo.com>: > >> >> >> Hi Camilo, >> >> You can either use Henrik's or mine to find it, >> unlist(apply(dat1[,-(1:2)],1,function(x) tail(x[!is.na(x)],1))) >> x3 x2 x1 >> 0.6 0.3 0.1 >> >> #or you can use my functiton >> >> dat3<-data.frame(NewColumn=c(unlist(lapply(dat2,function(x) >> tail(x[!is.na(x)],1))),NA)) >> dat4<-data.frame(dat1,dat3) >> rownames(dat4)<-1:nrow(dat4) >> dat4 >> # Lat Lon x1 x2 x3 NewColumn >> #1 1 12 0.4 0.5 0.6 0.6 >> #2 1 12 0.2 0.3 NA 0.3 >> #3 1 11 0.1 NA NA 0.1 >> #4 1 10 NA NA NA NA >> >> A.K. >> >> >> >> >> >> >> ----- Original Message ----- >> From: Camilo Mora <cm...@dal.ca> >> To: arun <smartpink...@yahoo.com> >> Cc: Henrik Singmann <henrik.singm...@psychologie.uni-freiburg.de>; R help >> <r-help@r-project.org> >> Sent: Tuesday, July 24, 2012 10:56 PM >> Subject: Re: First value in a row >> >> Hi Henrik and Arun, >> >> I now understand the script you provided. Very smart solution I think. I >> wonder, however, if there is an alternative way as to count the last number >> in a row?. >> For instance, considering the following dataframe >> >> dat1<-read.table(text=" >> Lat Lon x1 x2 x3 >> 01 12 .4 .5 .6 >> 01 12 .2 .3 NA >> 01 11 .1 NA NA >> 01 10 NA NA NA >> ",sep="",header=TRUE) >> >> the last value (from left to right) should be: >> .6 >> .3 >> .1 >> NA >> >> NAs are always consecutive once they appear. >> >> Thanks again, >> >> Camilo >> >> >> Camilo Mora, Ph.D. >> Department of Geography, University of Hawaii >> Currently available in Colombia >> Phone: Country code: 57 >> Provider code: 313 >> Phone 776 2282 >> From the USA or Canada you have to dial 011 57 313 776 2282 >> http://www.soc.hawaii.edu/mora/ >> >> >> >> Quoting arun <smartpink...@yahoo.com>: >> >>> Hi Henrik, >>> >>> Thanks for testing it to a different dataset. I didn't test it at that >>> time to multiple conditions. Probably, apply is a better method. >>> >>> >>> Anyway, you can still get the same result by doing this: >>> >>> dat1<-read.table(text=" >>> Lat Lon x1 x2 x3 >>> 01 10 NA NA .1 >>> 01 11 .4 NA .3 >>> 01 12 NA .5 .6 >>> ",sep="",header=TRUE) >>> dat2<-data.frame(t(dat1[,3:5])) >>> dat3<-data.frame(dat1,NewColumn=unlist(lapply(dat2,function(x) >>> x[!is.na(x)][1]))) >>> row.names(dat3)<-1:nrow(dat3) >>> dat3 >>> # Lat Lon x1 x2 x3 NewColumn >>> #1 1 10 NA NA 0.1 0.1 >>> #2 1 11 0.4 NA 0.3 0.4 >>> #3 1 12 NA 0.5 0.6 0.5 >>> >>> #Now, to a slightly different dataset >>> dat1<-read.table(text=" >>> Lat Lon x1 x2 x3 >>> 01 10 NA NA NA >>> 01 11 NA NA .3 >>> 01 12 NA .6 NA >>> ",sep="",header=TRUE) >>> dat2<-data.frame(t(dat1[,3:5])) >>> dat3<-data.frame(dat1,NewColumn=unlist(lapply(dat2,function(x) >>> x[!is.na(x)][1]))) >>> row.names(dat3)<-1:nrow(dat3) >>> dat3 >>> #Lat Lon x1 x2 x3 NewColumn >>> #1 1 10 NA NA NA NA >>> #2 1 11 NA NA 0.3 0.3 >>> #3 1 12 NA 0.6 NA 0.6 >>> >>> >>> I hope this works well. >>> >>> >>> A.K. >>> >>> >>> >>> >>> ----- Original Message ----- >>> From: Henrik Singmann <henrik.singm...@psychologie.uni-freiburg.de> >>> To: arun <smartpink...@yahoo.com> >>> Cc: Camilo Mora <cm...@dal.ca>; R help <r-help@r-project.org> >>> Sent: Tuesday, July 24, 2012 10:18 AM >>> Subject: Re: First value in a row >>> >>> Hi, >>> >>> As Arun's idea was also my first idea let me pinpoint the problem of this >>> solution. >>> It only works if the data in question (i.e., columns x1 to x3) follow the >>> pattern of the example data insofar that the NAs form a triangle like >>> structure. This is so because it loops over columns instead of rows and >>> takes advantage of the triangle NA structure. >>> >>> For example, slightly changing the data leads to a result that does not >>> follow the description of Camilo seem to want: >>> >>> dat1<-read.table(text=" >>> Lat Lon x1 x2 x3 >>> 01 10 NA NA .1 >>> 01 11 .4 NA .3 >>> 01 12 NA .5 .6 >>> ",sep="",header=TRUE) >>> >>> # correct answer from description would be .1, .4, .5 >>> >>> # arun's solution: >>> data.frame(dat1,NewColumn=rev(unlist(lapply(dat1[,3:5],function(x) >>> x[!is.na(x)][1])))) >>> >>> # x3 x2 x1 >>> # 0.1 0.5 0.4 >>> >>> # my solution: >>> apply(dat1[,-(1:2)], 1, function(x) x[!is.na(x)][1]) >>> >>> # [1] 0.1 0.4 0.5 >>> >>> So the question is, what you want and how the data looks. >>> >>> Cheers, >>> Henrik >>> >>> >>> Am 24.07.2012 14:27, schrieb arun: >>>> Hi, >>>> >>>> Try this: >>>> >>>> dat1<-read.table(text=" >>>> Lat Lon x1 x2 x3 >>>> 01 10 NA NA .1 >>>> 01 11 NA .2 .3 >>>> 01 12 .4 .5 .6 >>>> ",sep="",header=TRUE) >>>> >>>> dat2<-dat1[,3:5] >>>> dat3<-data.frame(dat1,NewColumn=rev(unlist(lapply(dat2,function(x) >>>> x[!is.na(x)][1])))) >>>> row.names(dat3)<-1:nrow(dat3) >>>> dat3 >>>> Lat Lon x1 x2 x3 NewColumn >>>> 1 1 10 NA NA 0.1 0.1 >>>> 2 1 11 NA 0.2 0.3 0.2 >>>> 3 1 12 0.4 0.5 0.6 0.4 >>>> >>>> A.K. >>>> >>>> >>>> >>>> >>>> ----- Original Message ----- >>>> From: Camilo Mora <cm...@dal.ca> >>>> To: r-help@r-project.org >>>> Cc: >>>> Sent: Tuesday, July 24, 2012 2:48 AM >>>> Subject: [R] First value in a row >>>> >>>> Hi. >>>> >>>> This is likely a trivial problem but have not found a solution. Imagine >>>> the following dataframe: >>>> >>>> Lat Lon x1 x2 x3 >>>> 01 10 NA NA .1 >>>> 01 11 NA .2 .3 >>>> 01 12 .4 .5 .6 >>>> >>>> I want to generate another column that consist of the first value in each >>>> row from columns x1 to x3. That is >>>> >>>> NewColumn >>>> .1 >>>> .2 >>>> .4 >>>> >>>> Any input greatly appreciated, >>>> >>>> Thanks, >>>> >>>> Camilo >>>> >>>> >>>> Camilo Mora, Ph.D. >>>> Department of Geography, University of Hawaii >>>> >>>> ______________________________________________ >>>> 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. >>>> >>>> >>> >>> -- >>> Dipl. Psych. Henrik Singmann >>> PhD Student >>> Albert-Ludwigs-Universität Freiburg, Germany >>> http://www.psychologie.uni-freiburg.de/Members/singmann >>> >>> >>> >> >> > > ______________________________________________ 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.