R中的速度优化
我目前正在开发一个函数,该函数在一个由2列组成的大矩阵上工作(值的数量通常大于2000),并且存在时间问题 这里是我矩阵的头部: 以下是我的职能: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
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]
}
就是这样。这是一个代码,对于vectorv
中的每一个值,它都会告诉您它落入了哪个箱子
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