我有两个向量。我需要找到这两者之间的交集,并做一个很好的情节。
所以,这是一个非常简单的数据框示例:
df <- data.frame( id <- c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
p <-c(5,7,9,11,13,15,17,19,21,23,20,18,16,14,12,10,8,6,4,2 ),
q <-c(3,5,7,13,19,31,37,53,61,67,6,18,20,24,40,46,66,70,76,78))
colnames(df) <- c("id","price","quantity")
supply <- df[df$id == 1,]
demand <- df[df$id == 2,]
plot( x = supply$quantity, y = supply$price, type = "l", ylab = "price", xlab = "quantity")
lines(x = demand$quantity , y = demand$price, type = "l")
grid()
现在,我可以绘制它们并手动找到交点,但是你可以让R计算这两条线之间的交点吗?
数据可以进行大幅度的跳跃,线条可以从非常水平到近乎水平。
答案 0 :(得分:5)
小心创建数据框。您想要=
,而不是<-
。另外,为了清楚起见,请将id设为一个因素。
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)
然后我们使用approx
分别计算每个数量的供应和需求价格。
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]