使用一些决策规则加速for循环(或远离它)
我有一个for循环,它试图检查向量使用一些决策规则加速for循环(或远离它),r,performance,for-loop,R,Performance,For Loop,我有一个for循环,它试图检查向量vals中的每个元素在4个不同的向量(dp,up,de,ue)中正好包含两次,但是: 只能在dp或de和中找到一次 只能在up或ue 我试图检查的向量有数百万个元素,这需要几个小时,我认为下面的代码可以加快速度 MRE: vals这行吗 pervec <- sapply(list(dp,de,up,ue), function(a) rowSums(sapply(a, `==`, vals))) pervec #
vals
中的每个元素在4个不同的向量(dp
,up
,de
,ue
)中正好包含两次,但是:
dp
或de
和中找到一次李>
up
或ue
vals这行吗
pervec <- sapply(list(dp,de,up,ue),
function(a) rowSums(sapply(a, `==`, vals)))
pervec
# [,1] [,2] [,3] [,4]
# [1,] 1 1 0 0
# [2,] 0 1 1 0
# [3,] 1 0 0 1
# [4,] 1 1 1 0
# [5,] 0 0 1 0
# [6,] 2 0 0 0
ind <- xor(pervec[,1] == 1, pervec[,2] == 1) & xor(pervec[,3] == 1, pervec[,4] == 1)
ind
# [1] FALSE TRUE TRUE FALSE FALSE FALSE
vals[ind]
# [1] "b" "c"
pervec在列表中有一些混乱。您已经在grepl
上执行了sum
(基于示例,a==
是否会得到相同的结果),然后在f
上再次执行sum
?我同意将总和更改为f我的意思是,如果它不是部分匹配,您可以使用==
,而不是grepl
,如果您在de
中添加一个“b”,即de我对其进行了不同的解释,即dp
和其他有效设置。我把“应该只找到一次”解释为“在其中一个中找到,而不是在另一个中找到”。如果你的解释是正确的,那么我的回答确实是不够的。(这就是为什么一个好的例子是重要的!)@darren是正确的,这个例子缺少什么?@erasmortg:有些清晰,这是你在问题中编辑的。你所说的不一定是错的,但对dp
的含义做出不同的假设是现实的。太糟糕了,这比for
循环快多了:-)请参见我的编辑,它可以更好地处理更新输入的重复。
pervec <- sapply(list(dp,de,up,ue),
function(a) rowSums(sapply(a, `==`, vals)))
pervec
# [,1] [,2] [,3] [,4]
# [1,] 1 1 0 0
# [2,] 0 1 1 0
# [3,] 1 0 0 1
# [4,] 1 1 1 0
# [5,] 0 0 1 0
# [6,] 2 0 0 0
ind <- xor(pervec[,1] == 1, pervec[,2] == 1) & xor(pervec[,3] == 1, pervec[,4] == 1)
ind
# [1] FALSE TRUE TRUE FALSE FALSE FALSE
vals[ind]
# [1] "b" "c"