R:找到两个向量的交集

时间:2013-10-21 11:50:45

标签: r intersection line-intersection

我有两个向量。我需要找到这两者之间的交集,并做一个很好的情节。

所以,这是一个非常简单的数据框示例:

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计算这两条线之间的交点吗?

数据可以进行大幅度的跳跃,线条可以从非常水平到近乎水平。

1 个答案:

答案 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]
相关问题