gpt4 book ai didi

r - 使用 ifelse 的函数不返回 R 中的向量

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

我写了一个有点奇怪的函数,它应该简单地返回一个带有两个值的向量。

例如,如果您输入 33 ,你应该回来c(30, 40) .
没有比这更简单的了。

return_a_range <- function(number){
ans <- ifelse( (30 <= number & number <= 40), c(30, 40),
(ifelse( (40 < number & number <= 50), c(40, 50),
(ifelse( (50 < number & number <= 60), c(50, 60),
(ifelse( (60 < number & number <= 70), c(60, 70),
(ifelse( (70 < number & number <= 80), c(70, 80),
(ifelse( (80 < number & number <= 100), c(80, 100),
ans <- c("NA"))))))))))))
return(ans)}

return_a_range(33)

为什么这只返回 30 ?我怎么回不来了 c(30, 40) ?为什么 R 决定只返回向量第一个位置的值?

编辑
尽管大多数回复都与(有道理!)因为我写了一篇糟糕的文章而打我 ifelse声明,我认为@MrFick 在下面的评论中识别并回答了真正的问题。

最佳答案

你可以只使用:

> c(floor(33 / 10), ceiling(33 / 10))*10
[1] 30 40

或者作为一个函数 - 感谢@Khashaa 的一个很好的修改(在评论中):
f <- function(x) if(abs(x) >= 100) NA else c(floor(x / 10), floor(x/10) + 1)*10
f(44)
#[1] 40 50

f(40)
#[1] 40 50

这种函数会比多个嵌套的效率高很多 ifelse s。

我最初忽略了您想要为 40 的输入值返回 30 - 40(我认为您想要 40 - 50,这就是上述函数所做的)。

所以这是一个稍微复杂的函数,它应该实现该行为:
ff <- function(x) {
if (abs(x) >= 100L) {
NA
} else {
y <- floor(x / 10L) * 10L
if (x %% 10L == 0L) {
c(y - 10L, y)
} else {
c(y, y + 10L)
}
}
}

并在行动中:
ff(40)
#[1] 30 40
ff(45)
#[1] 40 50

或者,如果您有一个数字向量,则可以对其进行 lapply/sapply:
( x <- sample(-100:100, 3, F) )
#[1] 73 89 -97

lapply(x, ff)
#[[1]]
#[1] 70 80
#
#[[2]]
#[1] 80 90
#
#[[3]]
#[1] -100 -90

或者
sapply(x, ff)
# [,1] [,2] [,3]
#[1,] 70 80 -100
#[2,] 80 90 -90

关于r - 使用 ifelse 的函数不返回 R 中的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27610802/

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