【问题标题】:Writing custom function in R which takes input vector with units在 R 中编写自定义函数,该函数采用带单位的输入向量
【发布时间】:2021-07-31 09:52:06
【问题描述】:

我正在尝试编写一个函数my_heights(),它采用类似向量的heights,并返回一个高度一致的数字向量。 单位应指定为函数参数,默认为 cm。为简单起见,假设单位只能是 m 或 cm。

我有以下向量:

heights <- c("188 cm", "1.73 m", "192 cm", "175 cm", "165 cm", "191 cm", "1.85 m")

期望的输出(健全性检查):

my_heights(heights)
[1] 188 173 192 175 165 191 185

my_heights(heights, "m")
[1] 1.88 1.73 1.92 1.75 1.65 1.91 1.85

我知道当调用默认函数时,它会按原样返回带有cm 的高度,但带有m 的高度乘以100。对于后面带有m 的高度按原样返回但是cm 的高度除以 100。不知道我应该如何将高度分开 cmm 以使其正常工作。

【问题讨论】:

    标签: r function


    【解决方案1】:

    你可以试试下面的用户功能my_heights

    my_heights <- function(h, unit = "cm") {
      ifelse(gsub(".*\\s+", "", h) == unit,
        1,
        100^ifelse(unit == "cm", 1, -1)
      ) * as.numeric(gsub("\\s.*$", "", h))
    }
    

    这样

    > my_heights(heights)
    [1] 188 173 192 175 165 191 185
    
    > my_heights(heights, "m")
    [1] 1.88 1.73 1.92 1.75 1.65 1.91 1.85
    
    > my_heights(heights, "cm")
    [1] 188 173 192 175 165 191 185
    

    【讨论】:

      【解决方案2】:

      这将按如下方式完成:

      my_heights <- function(x, unit = "cm"){
        units <- c(mm = 0.1, cm = 1, dm=10, m = 100, km = 100000)
        unname(with(read.table(text=x, h=F), V1*units[V2]))/units[unit]
      }
      
      my_heights(heights)
      [1] 188 173 192 175 165 191 185
      my_heights(heights, "m")
      [1] 1.88 1.73 1.92 1.75 1.65 1.91 1.85
      my_heights(heights, "mm")
      [1] 1880 1730 1920 1750 1650 1910 1850
      

      【讨论】:

        【解决方案3】:

        创建一个函数,输入“x”作为值向量,unit 将默认大小写指定为“cm”,然后使用来自readrparse_number 或来自base Rsub要提取数字部分,请根据字符串末尾 ($) 出现的“m”,使用 grepl 创建一个逻辑向量 (i1)。指定条件以基于'单位'的值的子集相乘或相除,赋值并返回数值转换的向量

        clean_heights <- function(x, unit = 'cm') {
                  x1 <-  readr::parse_number(x) 
                  # // base R with sub
                  #x1 <- as.numeric(sub("\\s+\\D+", "", x))            
                  i1 <- grepl('\\sm$', x)
                  if(unit == 'cm') {
                       x1[i1] <- x1[i1] * 100
                   } else {
                      x1[!i1] <- x1[!i1]/100
                     }
                    x1
          }
        

        -测试

        clean_heights(heights)
        #[1] 188 173 192 175 165 191 185
        
        clean_heights(heights, "m")
        #[1] 1.88 1.73 1.92 1.75 1.65 1.91 1.85
        

        【讨论】:

        • 正是我需要的。
        猜你喜欢
        • 2015-02-21
        • 1970-01-01
        • 2020-08-09
        • 2021-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多