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

Setting the units of each column of an existing dataframe in R

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

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 个值。我也尝试过使用 lapply()mapply() 的各种方法,但无法使其正常工作,并且 google 没有提出任何相关的内容。

你可以做到

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() 函数,但除此之外,此函数的输出未分配给循环中的任何对象。第三,这里不需要 double [[]] 。最后,您可以按照 package documentation:

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

根据文档,set_units() 是一个 pipe-friendly 函数,默认情况下期望单位作为符号传递。对于标准评估,使用参数 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