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.