Here is yet another solution. This one uses by() which generates nice visual output.
score <- data.frame( id = c('001','001','001','002','003','003'), math = c(80,75,70,65,65,70), reading = c(65,70,88,NA,90,NA) ) out <- by( score, score$id, tail, n=2 ) # score$id: 001 # id math reading # 2 001 75 70 # 3 001 70 88 # ------------------------------------------------------------ # score$id: 002 # id math reading # 4 002 65 NA # ------------------------------------------------------------ # score$id: 003 # id math reading # 5 003 65 90 # 6 003 70 NA And if you want to put it back into a data frame, use do.call( "rbind", as.list(out) ) # id math reading # 001.2 001 75 70 # 001.3 001 70 88 # 002 002 65 NA # 003.5 003 65 90 # 003.6 003 70 NA Ignore the rownames here. HTH, Adai Lauri Nikkinen wrote: > Hi R-users, > > Following this post http://tolstoy.newcastle.edu.au/R/help/06/06/28965.html , > how do I get last two rows (or six or ten) by id group out of the data > frame? Here the example gives just the last row. > > Sincere thanks, > Lauri > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@stat.math.ethz.ch 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. > > > ______________________________________________ R-help@stat.math.ethz.ch 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.