x是一个双精度向量,包含小于和大于1的数字。
x <- c(1, 2, 3, 0.1, 0.02, 0.003)
如果x中的一个元素小于1,我想把这个元素乘以10,直到它大于1;如果这个元素已经大于1,它应该保持不变。结果应该又是一个双精度向量。
(1, 2, 3, 1, 2, 3)
我觉得这应该是很简单的事 但我不知道该怎么解决。这是我目前所做的。我定义了一个函数 times_ten,它可以完成上述的操作。
times_ten <- function(x) {
while (x < 1) {
x <- x * 10
}
}
然后我把这个函数应用到向量x上。
y <- sapply(c(1, 2, 3, 0.1, 0.02, 0.003), function(x) times_ten(x))
但现在y是一个列表,不再是一个双倍数了 更糟糕的是,现在 y 中的所有值都是 NULL。
我是否需要修改函数,如果需要,如何修改?还是完全有更好的方法?
我猜你漏掉了 return
语句。
times_ten <- function(x){
while (x < 1) {
x <- x * 10
}
return(x)
}
这样,你的解决方案就完全正确了。
y <- sapply(c(1, 2, 3, 0.1, 0.02, 0.003), function(x) times_ten(x))
下面是另一种解决方案。
library(tidyverse)
x %>% map_dbl(~times_ten(.x))
给我的输出是
[1] 1 2 3 1 2 3
作为 @Neel 说,你需要 return(x)
在您的函数结尾处 times_ten
.
下面是一个比较简单的转换方法,即 log10()
被用于
y <- x*10**ifelse(-log10(x)>=1,ceiling(-log10(x)),0)
以致于
> y
[1] 1 2 3 1 2 3