我的数据框设置如下:
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概述的solve命令。我不确定如何在数据框中的所有变量和池中迭代这个过程,特别是当线路交叉的等级在池塘/变量之间变化时。
答案 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
表示线段不相交。