R 如何使检查哪些值不是按升序排列的函数更快?

R 如何使检查哪些值不是按升序排列的函数更快?,r,for-loop,data.table,R,For Loop,Data.table,我写了一个函数来检查向量中哪些值不是按升序排列的。因此,将检查向量中的每个元素是否高于其左侧的所有元素 然后,我将此函数用于分组数据,但这需要很长的时间(大约6-7分钟)。我的原始数据有近300万行和13480个组 我的代码: check_which_not_ordered <- function(x) { res <- rep(NA, length(x)) for(i in 1:length(x)) { for (j in 1:

我写了一个函数来检查向量中哪些值不是按升序排列的。因此,将检查向量中的每个元素是否高于其左侧的所有元素

然后,我将此函数用于分组数据,但这需要很长的时间(大约6-7分钟)。我的原始数据有近300万行和13480个组

我的代码:

  check_which_not_ordered <- function(x) {  

      res <- rep(NA, length(x))

      for(i in 1:length(x)) {
         for (j in 1:i) {
         res[i] <- all(x[i] >= x[1:j])
         }
      }

  return(res) 

  }

  setDT(dt)[, ordered := check_which_not_ordered(no_of_reviews), 
            by = .(country, id)] 
使用
cummax()
函数检查未排序的元素,查看每个元素是否等于同一位置的累积最大值。然后把NA放回去

库(微基准)
dtt使用
cummax()
函数,查看每个元素是否等于同一位置的累积最大值。然后把NA放回去

库(微基准)
dtt另一个选项是:

DT[, nor := replace(no_of_reviews, is.na(no_of_reviews), -Inf)][,
    o4 := cummax(no_of_reviews) & no_of_reviews >= cummax(nor), .(country, id)][,
        nor := NULL]
输出:

    country id no_of_reviews ordered    o4
 1:     USA  1            10    TRUE  TRUE
 2:     USA  1            12    TRUE  TRUE
 3:     USA  1             3   FALSE FALSE
 4:     USA  1             4   FALSE FALSE
 5:     USA  1            13    TRUE  TRUE
 6:     USA  2             2    TRUE  TRUE
 7:     USA  2             3    TRUE  TRUE
 8:     USA  2             4    TRUE  TRUE
 9:     USA  2             5    TRUE  TRUE
10:     USA  2             6    TRUE  TRUE
11:  Canada  3             7    TRUE  TRUE
12:  Canada  3             9    TRUE  TRUE
13:  Canada  3            NA      NA    NA
14:  Canada  3             7   FALSE FALSE
15:  Canada  3            NA      NA    NA
16:  Canada  4            NA      NA    NA
17:  Canada  4             7      NA    NA
18:  Canada  4             2   FALSE FALSE
19:  Canada  4             9      NA    NA
20:  Canada  4            10      NA    NA
数据:

库(data.table)
DT另一种选择是:

DT[, nor := replace(no_of_reviews, is.na(no_of_reviews), -Inf)][,
    o4 := cummax(no_of_reviews) & no_of_reviews >= cummax(nor), .(country, id)][,
        nor := NULL]
输出:

    country id no_of_reviews ordered    o4
 1:     USA  1            10    TRUE  TRUE
 2:     USA  1            12    TRUE  TRUE
 3:     USA  1             3   FALSE FALSE
 4:     USA  1             4   FALSE FALSE
 5:     USA  1            13    TRUE  TRUE
 6:     USA  2             2    TRUE  TRUE
 7:     USA  2             3    TRUE  TRUE
 8:     USA  2             4    TRUE  TRUE
 9:     USA  2             5    TRUE  TRUE
10:     USA  2             6    TRUE  TRUE
11:  Canada  3             7    TRUE  TRUE
12:  Canada  3             9    TRUE  TRUE
13:  Canada  3            NA      NA    NA
14:  Canada  3             7   FALSE FALSE
15:  Canada  3            NA      NA    NA
16:  Canada  4            NA      NA    NA
17:  Canada  4             7      NA    NA
18:  Canada  4             2   FALSE FALSE
19:  Canada  4             9      NA    NA
20:  Canada  4            10      NA    NA
数据:

库(data.table)

为什么要使用循环并检查整个向量?如果您左边的值高于您的值,那么lag(x)是否需要
j
循环?或者只是
对于(i in 1:length(x))res[i]x[1:i])
@Fnguyen我不认为使用滞后函数会给我期望的输出。例如,如果我分析向量c(10,12,3,4,13),那么结果应该是c(真,真,假,假,真)。如果我正确理解你的建议,只检查左边的一个值就会得到c(真,真,假,真,真,真)。chinsoon12你完全正确,
j
循环是不必要的。但是,这并不能加快计算速度。为什么要使用循环并检查整个向量?如果您左边的值高于您的值,那么lag(x)是否需要
j
循环?或者只是
对于(i in 1:length(x))res[i]x[1:i])
@Fnguyen我不认为使用滞后函数会给我期望的输出。例如,如果我分析向量c(10,12,3,4,13),那么结果应该是c(真,真,假,假,真)。如果我正确理解你的建议,只检查左边的一个值就会得到c(真,真,假,真,真,真)。chinsoon12你完全正确,
j
循环是不必要的。但是,这并没有加快计算速度。只是为了反馈3个函数对于Canada和id=4不返回相同的值。参见
setDT(dtt)[,排序:=检查未排序的(无审查),(国家,id)][,o2:=检查未排序的2(无审查),(国家,id)],o3:=检查未排序的3(无审查),(国家,id)]
。这是由于NAs的存在。另见
all(c(TRUE,NA));全部(c(假,NA));任何(c(真,NA));any(c(FALSE,NA))
我把第三个函数留在里面是个错误/输入错误。我注意到了它的问题,最初我认为该方法可能会快一点,但事实并非如此。我从计时中删除了它,但忘了删除函数本身。谢谢你指出这一点@我无法使用
check\u not\u ordered2()
函数复制结果。这只是带有NAS的向量的一个问题,只是为了反馈3个函数不返回相同的加拿大值且id=4。参见
setDT(dtt)[,排序:=检查未排序的(无审查),(国家,id)][,o2:=检查未排序的2(无审查),(国家,id)],o3:=检查未排序的3(无审查),(国家,id)]
。这是由于NAs的存在。另见
all(c(TRUE,NA));全部(c(假,NA));任何(c(真,NA));any(c(FALSE,NA))
我把第三个函数留在里面是个错误/输入错误。我注意到了它的问题,最初我认为该方法可能会快一点,但事实并非如此。我从计时中删除了它,但忘了删除函数本身。谢谢你指出这一点@我无法使用
check\u not\u ordered2()
函数复制结果。这只是一个问题的矢量与NAsBrilliant,给出正确的结果,并立即工作。非常感谢。卓越的,给出正确的结果,并立即工作。非常感谢。