Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用一些决策规则加速for循环(或远离它)_R_Performance_For Loop - Fatal编程技术网

使用一些决策规则加速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 #

我有一个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
    #      [,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"