我写了一个有点怪诞的函数,它应该只返回一个带有两个值的向量。
例如,如果您输入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的认可和回答。
答案 0 :(得分:4)
你可以使用:
> 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
更有效。
我最初忽略了你想要返回30 - 40输入值为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
或者,如果你有一个数字向量,你可以对它进行激情/讽刺:
( 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
答案 1 :(得分:2)
这是使用%/%
的另一种变体,它也适用于f2(40)
案例(但我在其他地方失败了吗?)
f2 <- function(x) if(abs(x) >= 100) NA else c(x %/% 10, (x + 10) %/% 10) * 10
f2(40)
## [1] 40 50
答案 2 :(得分:1)
如果你真的想以你使用它的方式使用你的功能而不是去docendo的答案(这个问题我不明白为什么)你可以做以下事情(如果你需要的话)在将来做类似的事情):
return_a_range <- function(number){
ans <- ifelse( (30 <= number & number <= 40), a<-c(30, 40),
(ifelse( (40 < number & number <= 50), a<-c(40, 50),
(ifelse( (50 < number & number <= 60), a<-c(50, 60),
(ifelse( (60 < number & number <= 70), a<-c(60, 70),
(ifelse( (70 < number & number <= 80), a<-c(70, 80),
(ifelse( (80 < number & number <= 100), a<-c(80, 100),
a <- c("NA"))))))))))))
return(a)}
> return_a_range(33)
[1] 30 40
> return_a_range(62)
[1] 60 70
我唯一做的就是将矢量保存在每个a
的变量ifelse
中。