gpt4 book ai didi

r - 我怎样才能让这个 R 代码片段更快、更像 R-ish?

转载 作者:行者123 更新时间:2023-12-02 05:52:34 25 4
gpt4 key购买 nike

来自其他各种语言,我发现 R 功能强大且直观,但我对其性能并不满意。因此,我决定尝试改进我编写的一些片段,并学习如何在 R 中更好地编写代码。

这是我写的一个函数,试图确定一个向量是否是二进制值(两个不同的值或只有一个值):

isBinaryVector <- function(v) {
if (length(v) == 0) {
return (c(0, 1))
}
a <- v[1]
b <- a
lapply(v, function(x) { if (x != a && x != b) {if (a != b) { return (c()) } else { b = x }}})
if (a < b) {
return (c(a, b))
} else {
return (c(b, a))
}
}

编辑:如果不是二进制值,则此函数预计会遍历向量然后返回 c(),如果不是二进制值则返回 c(a, b)它是,a 是较小的值,b 是较大的值(如果 a == b 则只是 c(a, a)。例如,对于

  A B C
1 1 1 0
2 2 2 0
3 3 1 0

我将应用这个isBinaryVector并得到:

$A
[1] 1 1

$B
[1] 1 1

$C
[1] 0 0

处理中等大小的数据集(大约 1800 * 3500,其中 2/3 是二进制值)所花费的时间约为 15 秒。该集合仅包含 float 。

无论如何我可以更快地做到这一点吗?

感谢您的任何意见!

最佳答案

您实质上是在尝试编写一个函数,如果一个向量恰好有两个唯一值,则返回 TRUE,否则返回 FALSE。

试试这个:

> dat <- data.frame(
+ A = 1:3,
+ B = c(1, 2, 1),
+ C = 0
+ )
>
> sapply(dat, function(x)length(unique(x))==2)
A B C
FALSE TRUE FALSE

接下来,您要获取最小值和最大值。 range 函数就是这样做的。所以:

> sapply(dat, range)
A B C
[1,] 1 1 0
[2,] 3 2 0

至此,您拥有了制作一个易于理解且速度极快的小函数的所有要素,即使是在处理大量数据时也是如此:

isBinary <- function(x)length(unique(x))==2

binaryValues <- function(x){
if(isBinary(x)) range(x) else NA
}

sapply(dat, binaryValues)

$A
[1] NA

$B
[1] 1 2

$C
[1] NA

关于r - 我怎样才能让这个 R 代码片段更快、更像 R-ish?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230101/

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