gpt4 book ai didi

r - 最快的整数数据分类方法

转载 作者:行者123 更新时间:2023-12-04 11:43:43 25 4
gpt4 key购买 nike

我在下表中给出了一个映射:

Input  Output
<4 0
5 0.4
6 0.5
7 0.65
8 0.75
9 0.85
>=10 1

到目前为止,我编写了3个版本:
k1 <- function(h) {
if (h <= 4) { k <- 0
} else if (h == 5) { k <- 0.4
} else if (h == 6) { k <- 0.5
} else if (h == 7) { k <- 0.65
} else if (h == 8) { k <- 0.75
} else if (h == 9) { k <- 0.85
} else if (h >= 10) { k <- 1}
return(k)
}

第二:
k2 <- function(h) {
k <- 0
k[h == 5] <- 0.4
k[h == 6] <- 0.5
k[h == 7] <- 0.65
k[h == 8] <- 0.75
k[h == 9] <- 0.85
k[h >= 10] <- 1.0
return(k)
}

第三:
k3 <- function(h) {
k <- cut(h, breaks=c(0, 5, 6, 7, 8, 9, Inf), labels=c(0, 0.5, 0.65, 0.75, 0.85, 1), right=FALSE)
return(k)
}

我需要在两种不同的情况下使用该功能。
首先,评估标量输入,其次,评估值向量。

对于标量输入:
h <- 5
microbenchmark(k1(h), k2(h), k3(h))

Unit: microseconds
expr min lq mean median uq max neval
k1(h) 1.208 1.5110 2.38264 1.8125 2.114 15.698 100
k2(h) 4.529 5.5855 8.71286 6.3400 7.849 73.053 100
k3(h) 52.224 54.0360 71.74953 68.9785 79.393 304.286 100

对于矢量输入:
h <- rep(5, 250)
microbenchmark(sapply(h, k1), k2(h), k3(h))
Unit: microseconds
expr min lq mean median uq max neval
sapply(h, k1) 595.592 617.327 641.8598 637.8535 654.9100 857.918 100
k2(h) 15.397 17.207 19.5470 18.1130 19.6225 49.508 100
k3(h) 110.486 116.070 131.3117 121.2020 140.6720 275.910 100

因此,对于标量输入,k1最快,对于矢量输入,k2最快。

您是否有提高速度的可能性?我不敢相信这种笨拙的if/else代码在标量情况下应该最快。
而且,我想拥有一个统一的功能,而不是两个独立的功能。

最佳答案

findInterval是R中最快的功能。

out <- c(0, .4, .5, .65, .75, .85, 1)
k6 <- function(h){
ind <- findInterval(h, c(4, 5, 6, 7, 8, 9) +0.1) + 1
out[ind]
}

h <- rep(5, 250)
microbenchmark(k2(h), k4(h), k6(h), unit="relative")
Unit: relative
# expr min lq mean median uq max neval
# k2(h) 2.283983 2.347714 2.225037 2.392578 2.319125 1.184224 100
# k4(h) 1.830939 1.725286 1.699866 1.701196 1.599973 1.414026 100
# k6(h) 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100

关于r - 最快的整数数据分类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31185946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com