代码之家  ›  专栏  ›  技术社区  ›  vorpal

在R中设置现有数据帧的每列的单位

  •  0
  • vorpal  · 技术社区  · 7 年前

    我有一个包含一串列的数据框架和一个单独的列表,其中包含每列的单位。我觉得以下方法应该有效:

    library(units)
    df = data.frame(1:4, 2:5, 3:6)
    units = c("mg/L", "pH", "s")
    for (i in length(df)){
      set_units(df[[i]], units[[i]])
    }
    

    然而 set_units() 试图设置 units[[i]] 作为单位(毫不奇怪,它不是SI单位),而不是读取 i 单位的th值。我试过各种各样的方法 lapply() 和 mapply() 但还没能让它发挥作用,谷歌也没有提出任何相关的建议。

    1 回复  |  直到 7 年前
        1
  •  1
  •   lroha    7 年前

    根据文件 set_units() 是一个管道友好型函数,默认情况下,该函数希望单位作为符号传递。对于标准评估,使用参数 mode = "standard" .

    library(units)
    library(purrr)
    
    df = data.frame(1:4, 2:5, 3:6)
    units = c("mg/L", "pH", "s")
    
    df %>%
      map2_dfc(units,  ~set_units(.x, .y, mode = "standard"))
    
    # A tibble: 4 x 3
        X1.4  X2.5  X3.6
      [mg/L]  [pH]   [s]
    1      1     2     3
    2      2     3     4
    3      3     4     5
    4      4     5     6
    
        2
  •  1
  •   user11538509 user11538509    7 年前

    你能行

    df = data.frame(1:4, 2:5, 3:6)
    units = c("mg/L", "pH", "s")
    for(i in 1:ncol(df)){
      units(df[ , i]) <- units[i]
    }
    df
    
          X1.4   X2.5  X3.6
    1 1 [mg/L] 2 [pH] 3 [s]
    2 2 [mg/L] 3 [pH] 4 [s]
    3 3 [mg/L] 4 [pH] 5 [s]
    4 4 [mg/L] 5 [pH] 6 [s]
    

    您提供的代码存在不同的问题。第一 i in length(df) 不会将每个列编号都用于 i 但只有数字 3 就你而言。第二,我不知道 set_units() 函数,但除此之外,此函数的输出未指定给循环中的任何对象。第三,你不需要加倍努力 [[]] 在这里最后,你可以使用 units() 正如在 package documentation:

    # The easiest way to assign units to a numeric vector is like this:
    x <- y <- 1:4
    units(x) <- "m/s" # meters / second