2015-12-29 129 views
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))) 

我想找到在这些线与方程y线相交的点= 0.5 -x如本图:

enter image description here

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

回答

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表示线段不相交。