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

问题描述 投票:1回答:1

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。

我是否需要修改函数,如果需要,如何修改?还是完全有更好的方法?

r function vector apply
1个回答
2
投票

我猜你漏掉了 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

4
投票

作为 @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
© www.soinside.com 2019 - 2024. All rights reserved.