【问题标题】:Finding the intersect of two lines from a data frame从数据框中查找两条线的交点
【发布时间】:2016-09-06 06:22:17
【问题描述】:

我的数据框设置如下:

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 的线相交的点,如下图所示:

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

【问题讨论】:

    标签: r


    【解决方案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 中的值是“排名”值。 NA 表示线段不相交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多