【问题标题】:R subscript out of bounds with for loopsR下标超出for循环的范围
【发布时间】:2013-06-14 14:41:42
【问题描述】:

我正在尝试计算落在 1000 个窗口内的条目,问题是我正在使用 for 循环,这使得需要执行的操作数量非常大(我对 R 相当陌生)而且我得到一个越界错误。我知道必须有更好的方法来做到这一点。

文件(警告文件超过 100mb):bamDF.txt

用途:

dget(file="bamDF.txt")

脚本:

attach(bamDF)
out <- matrix(0,1,ceiling((max(pos, na.rm=TRUE)-min(pos, na.rm=TRUE))/interval))
interval <- 1000
for(q in 1:nrow(bamDF)){
  for(z in 1:ceiling((max(pos, na.rm=TRUE)-min(pos, na.rm=TRUE))/interval)){
    if(min(pos, na.rm=TRUE)+interval*(z-1)<pos[q]&&pos[q]<(min(pos, na.rm=TRUE)+interval*(z))){
      out[z,] <- out[z,]+1;


    }

  }


}
detach(bamDF)

【问题讨论】:

  • “落在 1000 个窗口内”到底是什么意思?
  • 假设你有一个从 1 到 5000 的数轴,所以对于 1000 个窗口/bin,你将在该间隔内有 5 个 bin,然后你会查看落入每个 bin 的所有数字并计数他们。希望能澄清一点。
  • table(cut(yourdatatocount, seq(0, 5000, 1000))) 做的事情是否与您正在寻找的内容相近?

标签: r if-statement for-loop


【解决方案1】:

你可以使用cut函数

# set the seed to get a reproducible example
set.seed(12345)

min.val <- 0
max.val <- 5000
num.val <- 10000
# Generate some random values
values <- sample(min.val:max.val, num.val, replace=T)

interval <- 1000
num.split <- ceiling((max.val - min.val)/interval)+1

# Use cut to split the data. 
# You can set labels=FALSE if you want the group number 
# rather than the interval
groups <- cut(values, seq(min.val, max.val, length.out=num.split))

# Count the elements in each group
res <- table(groups)

res 将包含:

groups
    (0,1e+03] (1e+03,2e+03] (2e+03,3e+03] (3e+03,4e+03] (4e+03,5e+03] 
         1987          1974          2054          2000          1984 

同样,您可以只使用hist 函数:

 h <- hist(values, 10) # 10 bins

 h <- hist(values, seq(min.val, max.val, length.out=num.split))

h$counts 包含计数。如果您不想绘制结果,请使用plot=NULL

【讨论】:

  • 有趣的是,这就是我得到的(让我有点担心的快速问题是削减之间是否会有重叠,即是最后一个值groups (1144,2144] (2144,3143.99] (3143.99,4143.99] 1 6 4
  • @crysis405: 取右边的值,左边没有((] 是标准的数学符号)。您可以使用right 参数更改行为。结果看起来很奇怪,你只有 11 个值吗?
  • 不,我得到了 249239 个值,这是正确的,但为什么它不像你的那样从 0 开始,为什么会有小数位?
  • 好吧,你的数据范围是多少? (尝试range(data))。小数点来自这样一个事实,即间隔显然不适合该范围。如果您想从 0 开始,请像我一样施加一些间隔。 PS:我添加了另一个选项,使用hist
  • 范围是从 1144 到 249239505,这就解释了。
【解决方案2】:
grps <- seq(min(pos), max(pos), by= 1000)
counts <- table( findInterval( pos, c(grps, Inf) ) )
names(counts) <- grps

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多