识别数字是否在R中的数字范围内

时间:2012-06-25 13:49:56

标签: r plot

我知道标题会让这听起来很简单,但我有一个For循环来绘制我的数据。随着值的变化,X轴的极限也会变化(每个图的起点和终点都不同)。但是,我希望定义的X轴范围对于所有相似的图保持不变。由于我想要的X有大约40个可能的范围,这很复杂。

我有一个x-lims的数据框,我想为每个情节选择。它基本上看起来像:

   Trait  start    end
    A     123456   134567
    B     234546   245678
    C     234546   245678
    D     345678   356789

等等。所以,如果一个循环给出了值:Trait C,start = 235000和end = 240000,我想自动使用第三组默认X-lims。

编辑:添加更多信息(特质)。

2 个答案:

答案 0 :(得分:4)

如果您显示的data.frame被称为df(并且您确定变量end将大于start),那么这应该有效:

which(start > df$start & end < df$end)[1]

修改以回答修订后的问题

当您添加更多条件时,您可以扩展上述逻辑:

## Make your data easily reproducible for others
df <- read.table(text="Trait  start    end
    A     123456   134567
    B     234546   245678
    C     234546   245678
    D     345678   356789", header=TRUE)

## Set values from within your example loop
Trait <- "C"
start <- 235000
end <- 240000

## Get index of desired row
i <- which(Trait==df$Trait & start > df$start & end < df$end)[1]
## Extract xlim values in the form of a numeric vector
myxlim <- unname(unlist(df[i, c("start", "end")]))
myxlim
[1] 234546 245678

答案 1 :(得分:2)

我不确定我是否完全遵循这个问题。如果我正确理解你,你想确保你的每个图的范围是11111(在这个例子中,无论如何),但是上限和下限值会有很大的变化。所以,现在,您正在寻找一种方法来创建一个表格,其中包含您可能想要的所有可能的上限和下限,然后您希望在绘制时查找它们。

我建议您只需编写绘图语句就可以轻松完成,以确保最小值和最大值始终为11111。

假设您在一次循环迭代期间开始&lt; - 235000,结束&lt; - 240000,并且特性&lt; - B。你能像这样构建你的代码吗?

diff <- end-start
gap <- 11111-diff
plot(thing_you_plot,xlim(start-(gap/2),end+(gap/2))

有了数字:

diff <- 240000-235000 (5000)
gap <- 11111-5000 (6111)
plot(thing_you_plot,xlim(235000-(6111/2),240000+(6111/2)) 

(x limits are: 231944.5,243055.5, making the plot 11111 in length)

显然,如果你想,你可以使用floor和ceiling函数来获得数字而不是小数。从你的问题中不清楚“特质”是如何影响尺寸的;如果你有两个使用相同尺寸绘制的特征(B和C),为什么你需要这个表呢?我认为只要使用简单的函数为每个绘图做一些事情就可以做得更好。

根据修订编辑:

乔希打败了我,但是这里又是因为我几乎都打了它。

df <- data.frame(trait=c("A","B","C","D"),
                 start=c(123456,234546,234546,345678),
                 end=c(134567,245678,245678,356789))

trait <- "C"
start <- 235000
end <- 240000

xmin <- df[which(start > df$start & end < df$end & trait == df$trait),2]
xmax <- df[which(start > df$start & end < df$end & trait == df$trait),3]