为多个x值计算y值,以使其显示时不重叠(在R中)

问题描述 投票:0回答:1

我有一些要在R中显示的数据,其中每个数据点都包含由一条线连接的两个x值。我正在尝试创建一个为每个分配y值的函数,以便可以显示行而不会重叠-y值是任意的,但是我们的想法是将其显示为y的最低整数值,介于1和6之间(包括不与任何先前的值重叠。

这样的事情:chart

我的策略是通过测试所有进行中的数据点以查看其端点(x2)是否大于所讨论的数据点的起点(x1),为每个数据点创建一个y值的循环。这个想法是创建一个与当前值冲突的高度级别的列表,然后将y值设置为最低的非冲突值。这是我的代码,不幸的是它没有执行我想要的操作,而是为除最后一个给出的1之外的所有y值返回NA,它给出的值为1。我做错了什么?

calculate.height <- function(i) {
  if (i==1){height <- 1}
  else {
    bad.height.list <- c()
    for (j in i-1){
      if (x2[j] > x1[i] - 0.01) {append(bad.height.list,y[j])}
    }

    bad.levels <- c(1,2,3,4,5,6) %in% bad.height.list
    height <- min(which(bad.levels==FALSE))

  }
  return(height)
}

x1 <- c(1,1.5,2.7,3,4.75,9,11,15,15.1,18)
x2 <- c(2,4,3,7,6,9.5,17,15.6,24,19)

y <- c()

for (i in length(x1))  {
  y[i] <- calculate.height(i)
}
r loops for-loop na
1个回答
0
投票

[请注意,您的for (j in i-1)并没有真正循环播放。它将i-1分配给j,因此将仅迭代一次。

如果要从1到(i-1)循环,则必须执行for (j in 1:(i-1))

此外,请注意,您要在y[j]后面附加bad.height.list,但尚未初始化y[1],因此您会得到NA

经过上述更正,您的代码似乎可以正常工作:

calculate.height <- function(i) {
  if (i==1) {
    y[i] <- 1
  } else {
    bad.height.list <- c()
    for (j in 1:(i-1)) {
      if (x2[j] > x1[i] - 0.01) {
        append(bad.height.list, y[j])
      }
    }

    bad.levels <- c(1,2,3,4,5,6) %in% bad.height.list
    height <- min(which(bad.levels==FALSE))

  }
  return(height)
}

y
[1] 1 2 1 3 1 1 1 2 3 1
© www.soinside.com 2019 - 2024. All rights reserved.