从数据框中查找两条线的交叉点

时间:2015-12-29 11:47:56

标签: r

我的数据框设置如下:

set.seed(50)
m     <- matrix(nrow=4,ncol=9)
m[1,] <- 0

for(i in 2:4){
  for(j in 1:9){
    m[i,j] <- m[i-1,j] + runif(1,max = .25)
  }
}

df <- data.frame(pond=rep(c('A','B','C'),4,each = 3),
                 variable=(rep(c('most','least','random'),3)),
                 rank=rep(c(0,.1,.2,.3),each=9),
                 value= as.vector(t(m)))

我想找到这些线与方程y = 0.5-x的线相交的点,如下图所示:

enter image description here

我已经成功找到了交叉点的坐标,使用了here概述的solve命令。我不确定如何在数据框中的所有变量和池中迭代这个过程,特别是当线路交叉的等级在池塘/变量之间变化时。

1 个答案:

答案 0 :(得分:1)

set.seed(50)
m<-matrix(nrow=4,ncol=9)
m[1,]<-0

for(i in 2:4){
  for(j in 1:9){
    m[i,j]<-m[i-1,j]+runif(1,max = .25)
  }
}

df<-data.frame(pond=rep(c('A','B','C'),4,each = 3),
               variable=(rep(c('most','least','random'),3)),
               rank=rep(c(0,.1,.2,.3),each=9),
               value= as.vector(t(m)))

S <- lapply(split(df,df$pond),function(x){split(x,x$variable)})

Ix <-
  lapply( S,
          function(L)
          {
            lapply( L,
                    function(M)
                    {
                      a <- -1
                      b <- 0.5

                      intersection <- rep(NA,nrow(M)-1)

                      for ( n in 1:nrow(M)-1 )
                      {
                        x1 <- M$rank[n]
                        x2 <- M$rank[n+1]
                        y1 <- M$value[n]
                        y2 <- M$value[n+1]

                        det <- a*(x1-x2)+y2-y1
                        x <- (x1*(y2-y1)+(b-y1)*(x2-x1)) / det
                        lambda <- (a*x1-y1+b)/det

                        intersection[n] <-
                          ifelse( (0<=lambda) && (lambda<=1),
                                  x,
                                  NA )    
                      }

                      intersection
                    }
                  )
          }
        )

结果:

> Ix
$A
$A$least
[1]        NA        NA 0.2653478

$A$most
[1]        NA        NA 0.2809349

$A$random
[1]        NA        NA 0.2718672


$B
$B$least
[1]        NA        NA 0.2548668

$B$most
[1]        NA 0.1800216        NA

$B$random
[1]        NA        NA 0.2706433


$C
$C$least
[1]        NA 0.1771962        NA

$C$most
[1]        NA 0.1836434        NA

$C$random
[1]        NA        NA 0.2811595

Ix中的值是&#34; rank&#34;值。 NA表示线段不相交。