I can do this in multiple steps with summarise, joins, etc., but can't help thinking it can be accomplished in one plyr call. Here's a small example:> require(plyr) > require(lubridate) > data <- data.frame(+ date = rep(as.Date(ymd(20140101 + (0:3) * 100)), 2), + state = rep(c("A", "B"), each = 4), + value = rnorm(8)) What I want is clearly> data[c(4, 8), "value"][1] -1.007111 -1.527541 Here are my multiple steps:> statemaxval <- ddply(data, "state", summarise, max_date = max(date)) > rslt <- join(data, statemaxval, by = "state") > rslt <- subset(rslt, date == max_date) > rslt <- rslt[!duplicated(rslt), ] > rslt$value[1] -1.007111 -1.527541 Is there a one-step way to accomplish this? Something like ddply(data, "state", summarise, "GiveMeTheValueCorrespondingToMaxDateByState!!") Or is that only possible if there is only one unique value for a given combination of state and max(date)? Thanks, Dan
Hi, Try ?which.max() # unique values for the combination. ?ddply(data,.(state),summarize,max_date=value[which.max(date)])[,2] #or ?ddply(data,.(state),summarize,max_date=value[date == max(date)])[,2] A.K. On Thursday, February 13, 2014 11:15 AM, Dan Murphy <chiefmurphy at gmail.com> wrote: I can do this in multiple steps with summarise, joins, etc., but can't help thinking it can be accomplished in one plyr call. Here's a small example:> require(plyr) > require(lubridate) > data <- data.frame(+? date = rep(as.Date(ymd(20140101 + (0:3) * 100)), 2), +? state = rep(c("A", "B"), each = 4), +? value = rnorm(8)) What I want is clearly> data[c(4, 8), "value"][1] -1.007111 -1.527541 Here are my multiple steps:> statemaxval <- ddply(data, "state", summarise, max_date = max(date)) > rslt <- join(data, statemaxval, by = "state") > rslt <- subset(rslt, date == max_date) > rslt <- rslt[!duplicated(rslt), ] > rslt$value[1] -1.007111 -1.527541 Is there a one-step way to accomplish this? Something like ddply(data, "state", summarise, "GiveMeTheValueCorrespondingToMaxDateByState!!") Or is that only possible if there is only one unique value for a given combination of state and max(date)? Thanks, Dan ______________________________________________ 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.
ddply(data, "state", function(x) x[x$date == max(x$date), ])$value On Thu, Feb 13, 2014 at 11:13 AM, Dan Murphy <chiefmurphy at gmail.com> wrote:> I can do this in multiple steps with summarise, joins, etc., but can't > help thinking it can be accomplished in one plyr call. > > Here's a small example: > >> require(plyr) >> require(lubridate) >> data <- data.frame( > + date = rep(as.Date(ymd(20140101 + (0:3) * 100)), 2), > + state = rep(c("A", "B"), each = 4), > + value = rnorm(8)) > > What I want is clearly > >> data[c(4, 8), "value"] > [1] -1.007111 -1.527541 > > Here are my multiple steps: > >> statemaxval <- ddply(data, "state", summarise, max_date = max(date)) >> rslt <- join(data, statemaxval, by = "state") >> rslt <- subset(rslt, date == max_date) >> rslt <- rslt[!duplicated(rslt), ] >> rslt$value > [1] -1.007111 -1.527541 > > Is there a one-step way to accomplish this? > Something like > ddply(data, "state", summarise, "GiveMeTheValueCorrespondingToMaxDateByState!!") > > Or is that only possible if there is only one unique value for a given > combination of state and max(date)? > > Thanks, > Dan > > ______________________________________________ > 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.