R 如何使检查哪些值不是按升序排列的函数更快?
我写了一个函数来检查向量中哪些值不是按升序排列的。因此,将检查向量中的每个元素是否高于其左侧的所有元素 然后,我将此函数用于分组数据,但这需要很长的时间(大约6-7分钟)。我的原始数据有近300万行和13480个组 我的代码: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:
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,给出正确的结果,并立即工作。非常感谢。卓越的,给出正确的结果,并立即工作。非常感谢。