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 <lath at
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 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.