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。
我是否必须更改功能,如果需要,如何更改?还是完全有更好的方法?
答案 0 :(得分: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
答案 1 :(得分:1)
我想您错过了函数中的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