1

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

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

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

数据可能会发生巨大的跳跃,线条可以从非常台阶变为几乎水平。

4

1 回答 1

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]
于 2013-10-21T13:27:47.117 回答