【问题标题】:Calculating a y value for several x values, such that they are displayed without overlapping (in R)计算多个 x 值的 y 值,以使它们显示时不重叠(在 R 中)
【发布时间】:2020-09-25 08:58:16
【问题描述】:

我有一些数据试图在 R 中显示,其中每个数据点由两个通过一条线连接的 x 值组成。我正在尝试创建一个为每个分配y值的函数,以便可以在不重叠的情况下显示行-y值是任意的,但想法是将其显示为1到6之间的y的最低整数值(包括)不与任何前面的值重叠。

类似这样的: chart

我的策略是创建一个循环,通过测试所有正在进行的数据点来计算每个数据点的 y 值,以查看它们的端点 (x2) 是否大于相关数据点的起点 (x1)。这个想法是创建一个与当前值冲突的高度级别列表,然后将 y 值设置为最低的非冲突值。这是我的代码,不幸的是它没有做我想做的事情,而是为除最后一个之外的所有 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)
}

【问题讨论】:

  • 如果您在帖子中为相关示例添加预期的向量y,这将很有用。一般来说,请避免嵌入图形;最好把相关数据放进去。

标签: r loops for-loop na


【解决方案1】:

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

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

此外,请注意您要将y[j] 传递给bad.height.list,但仅使用append 并不能真正追加 - 您必须将其结果分配给bad.height.list

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

calculate.height <- function(i) {
  if (i == 1) {
    height <- 1
  } else {
    bad.height.list <- c()
    for (j in 1:(i-1)) {
      if (x2[j] > x1[i] - 0.01) {
        bad.height.list <- 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 <- c()

for (n in 1:length(x1)) {
  y[n] <- calculate.height(n)
}
y
[1] 1 2 1 3 1 1 1 2 3 1

但请注意,在函数内部使用全局范围内定义的变量(例如 y)并不是一个好习惯。

【讨论】:

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