在 R 中包括检测限 and/or 不平等元数据

Including detection limits and/or inequality metadata in R

我有一个庞大而复杂的水质数据集,我正试图将其从 excel 恐怖片中导入到 R 中。大多数变量都有与之关联的各种元数据。其中一些元数据可以放在自己的列中(例如,column1 = Magnesium;column2 = Magnesium.method),而其他元数据可以直接附加到观察值(例如,单位、检测限)。由于出色的 "units" 包,单位很容易,但检测限制应该,大概,也应该直接附加到观察,但我不清楚如何最好地做到这一点。

假设我们得到的结果低于检测限 6。最基本的我正在寻找的是这样的东西(虽然可能实际上没有使用 attr()):

Value1 <- NA
attr(Value1, "Lower detection limit") <- 6
Value1
[1] NA
Conservative value:
[1] 6
Mid-range value:
[1] 3
Lowest value:
[1] 0
set_conservativeness("mid")
Value1 + 1
[1] 4
set_conservativeness("low")
Value1 +1
[1] 1

看来这一定是一个很常见的问题,但我一直没能找到解决它的R包。也许我只是在咆哮错误的树,希望它成为一个值的属性而不是一个额外的列。

我实际上认为将数据和元数据放在一起是个好主意。听起来好像您也想拥有一些可以应用于测量的特定方法。

实际上,您所描述的是您自己的创作 class。有几种方法可以在 R 中创建自己的 class。最简单的可能是制作 S3 class.

这涉及到拥有一个构造函数,允许您设置测量值、单位和范围,并将其作为属性存储在返回的对象上。您还需要一个 format 方法、一个 print 方法和一个 as.data.frame 方法以及要应用于 class.[=18= 的任何自定义函数]

这是一个相当幼稚但实用的示例:

Measurement <- function(x, units = "mmol/l", range_min = 0, range_max = Inf)
{
  structure(x, class = "Measurement", units = units, 
            range_min = range_min, range_max = range_max)
}

format.Measurement <- function(x, ...)
{
  paste0(as.numeric(x), " ", attr(x, "units"), 
         " [", attr(x, "range_min"), " - ", attr(x, "range_max"), "]")
}

print.Measurement <- function(x, quote = FALSE)
{
  print(format(x), quote = quote)
}

as.data.frame.Measurement <- function(x, ...)
{
  structure(list(x), class = c("data.frame"), row.names = c(NA, length(x)))
}

现在您可以像这样创建一个包含 Measurement 个值的向量:

M <- Measurement(c(1.2, 3.6, 4.5, 2.0, 2.1, NA), units = "pmol/l", 0.1, 10)
M
#> [1] 1.2 pmol/l [0.1 - 10] 3.6 pmol/l [0.1 - 10] 4.5 pmol/l [0.1 - 10]
#> [4] 2 pmol/l [0.1 - 10]   2.1 pmol/l [0.1 - 10] NA pmol/l [0.1 - 10]

并将它们存储在数据框中:

data.frame(Measurement = M, ID = LETTERS[1:6])
#>             Measurement ID
#> 1 1.2 pmol/l [0.1 - 10]  A
#> 2 3.6 pmol/l [0.1 - 10]  B
#> 3 4.5 pmol/l [0.1 - 10]  C
#> 4   2 pmol/l [0.1 - 10]  D
#> 5 2.1 pmol/l [0.1 - 10]  E
#> 6  NA pmol/l [0.1 - 10]  F

reprex package (v0.3.0)

于 2020-04-29 创建