【问题标题】:R: Multiply each element < 1 in a list by 10 until the element is > 1R:将列表中每个<1的元素乘以10,直到元素> 1
【发布时间】:2020-08-14 23:33:48
【问题描述】:

x 是一个双精度向量,包含小于和大于 1 的数字:

x <- c(1, 2, 3, 0.1, 0.02, 0.003)

如果 x 中的一个元素小于一,我想将该元素乘以 10,直到它大于一;如果元素已经大于一,它应该保持不变。结果应该又是一个双精度向量:

(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】:

    正如@Neel 所说,您需要在函数times_ten 结束时使用return(x)


    下面是一种更简单的转换方法,其中使用了log10()

    y <- x*10**ifelse(-log10(x)>=1,ceiling(-log10(x)),0)
    

    这样

    > y
    [1] 1 2 3 1 2 3
    

    【讨论】:

    • @IceCreamToucan 谢谢!我认为只有在x 中的所有内容都小于 10 时,您的才能工作
    • 感谢您的解释:)
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多