You could store your first approach in a function and lapply it to your by_hour variable:
df <- data.frame( hour = factor(rep(1:5,4)), id = factor(rep(c("supply", "demand"), each = 10)), price = c(5,7,9,11,13,15,17,19,21,23, 20,18,16,14,12,10,8,6,4,2 ), quantity = c(3,5,7,13,19,31,37,53,61,67,6,18,20,24,40,46,66,70,76,78) ) myfu <- function(x){ df <- x # for simplicity quantity_points <- with( df, seq(min(quantity), max(quantity), length.out = 500) ) by_id <- split(df[, c("price", "quantity")], df$id) interpolated_price <- lapply( by_id, function(x) { with( x, approx( quantity, price, xout = quantity_points ) )$y } ) index_of_equality <- with(interpolated_price, which.min(abs(supply - demand))) quantity_points[index_of_equality] } by_hour <- split(df,df$hour) lapply(by_hour,myfu) Was that what you were looking for? Cheers, Christoph 2013/10/24 Lasse Thorst <l...@energidanmark.dk>: > Hi All > > I've gotten some awesome help getting a formular that finds the intersection > of two vectors. This works brilliantly, but I can't figure out how to make it > run over another factor. A simple example looks likes this: > > df <- data.frame( > id = factor(rep(c("supply", "demand"), each = 10)), > price = c(5,7,9,11,13,15,17,19,21,23,20,18,16,14,12,10,8,6,4,2 ), > quantity = c(3,5,7,13,19,31,37,53,61,67,6,18,20,24,40,46,66,70,76,78) > ) > > quantity_points <- with( > df, > seq(min(quantity), max(quantity), length.out = 500) > ) > > by_id <- split(df[, c("price", "quantity")], df$id) > > interpolated_price <- lapply( > by_id, > function(x) > { > with( > x, > approx( > quantity, > price, > xout = quantity_points > ) > )$y > } > ) > > index_of_equality <- with(interpolated_price, which.min(abs(supply - demand))) > quantity_points[index_of_equality] > > Question: I need to run this over a larger data frame, where I have the same > data, but also a new factor variable (called hour). So if you have the > original data frame and add: > > df <- data.frame( > hour = factor(seq(1:20)), > id = factor(rep(c("supply", "demand"), each = 10)), > price = c(5,7,9,11,13,15,17,19,21,23,20,18,16,14,12,10,8,6,4,2 ), > quantity = c(3,5,7,13,19,31,37,53,61,67,6,18,20,24,40,46,66,70,76,78) > ) > > How can I run it for each hour? I tried using: > by_hour <- split(df[, c("price", "quantity")], df$hour) > mapply(fx, by_hour) > > And gathering the above into a fx <- function(){"the neat code"}, but I can't > get it to work. > > Kind Regards, > Lasse > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. ______________________________________________ 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.