R中的速度优化

R中的速度优化,r,function,loops,optimization,R,Function,Loops,Optimization,我目前正在开发一个函数,该函数在一个由2列组成的大矩阵上工作(值的数量通常大于2000),并且存在时间问题 这里是我矩阵的头部: 以下是我的职能: get <- function() { v <- sample(1:1e6,20000, replace=TRUE) #for example table <- #mymatrix for ( i in 1:nrow(table)) { b <- which(v > table[i,1] &am

我目前正在开发一个函数,该函数在一个由2列组成的大矩阵上工作(值的数量通常大于2000),并且存在时间问题

这里是我矩阵的头部:

以下是我的职能:

get <- function()
{
  v <- sample(1:1e6,20000, replace=TRUE) #for example
  table <- #mymatrix
  for ( i in 1:nrow(table))
  {
    b <- which(v > table[i,1] & v < table[i,2]) #want index between 2 intervals
  }
  return(b)
}

get正如Andrey在评论中所说,您只返回最后一行的结果。您也没有将
table
传递到函数中(事实上,您的函数没有参数),而且还不清楚
v
代表什么,特别是为什么它的值比
table
的行多

但是,假设您想要所有行的结果,您可以做两件事:

  • 不要使用
    哪个
    ,您可能不需要数字索引
  • 对于
循环,使用矢量化而不是
get=函数(表){
v=样本(1:1E6,20000,替换=真)
v>表[,1]&v<表[,2]
}

就是这样。

这是一个代码,对于vector
v
中的每一个值,它都会告诉您它落入了哪个箱子

tbl = matrix(c(0,224,
               225,233,
               234,239,
               240,243,
               244,290,
               291,292),
             byrow = TRUE, 
             ncol = 2);

v = c(0,100,224,
      225, 230, 233,
      235)

fi1 = findInterval(v, tbl[,1]+1)
fi2 = findInterval(v, tbl[,2]-1)

set = (fi1!=fi2)
b = double(length(v))
b[set] = fi1[set];

# show the results
cbind(value = v, bin = b)

# value bin
# [1,]     0   0
# [2,]   100   1
# [3,]   224   0
# [4,]   225   0
# [5,]   230   2
# [6,]   233   0
# [7,]   235   3

首先,在循环中重写结果变量
b
。因此,只保留循环最后一次迭代中的值。也许还可以更改函数名以避免混淆?实际上,我需要数字标记正在处理SNP数据,并希望选择包含在从上一个文件分隔的段部分上的标记。这就是为什么我需要数字索引。“我提供的矩阵是包含染色体片段定界的矩阵,而”v“我的手笔。”chromosom@Kratos从您的描述中,不清楚您是否需要数字索引,听起来逻辑索引应该很好;你知道你可以用它来子集一个表,对吗?使用上面的,
table2[get(table1),]
正是您所期望的无论如何,如果你真的需要数字索引,你可以根据这个函数的结果调用
,在这个网站上,我们也通过投票并接受答案来感谢人们。
tbl = matrix(c(0,224,
               225,233,
               234,239,
               240,243,
               244,290,
               291,292),
             byrow = TRUE, 
             ncol = 2);

v = c(0,100,224,
      225, 230, 233,
      235)

fi1 = findInterval(v, tbl[,1]+1)
fi2 = findInterval(v, tbl[,2]-1)

set = (fi1!=fi2)
b = double(length(v))
b[set] = fi1[set];

# show the results
cbind(value = v, bin = b)

# value bin
# [1,]     0   0
# [2,]   100   1
# [3,]   224   0
# [4,]   225   0
# [5,]   230   2
# [6,]   233   0
# [7,]   235   3