R:将列表中每个<1的元素乘以10,直到该元素> 1

时间:2020-04-30 14:48:25

标签: r function vector apply

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。

我是否必须更改功能,如果需要,如何更改?还是完全有更好的方法?

2 个答案:

答案 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
相关问题