在R中包括检测极限和/或不等式元数据



我有一个庞大而复杂的水质数据集,我正试图将其从excel恐怖秀导入R中。大多数变量都有与之相关的各种元数据。其中一些元数据放在自己的列中是有意义的(例如,column1=镁;column2=镁。方法(,而其他元数据直接附加到观察值上是有意义(例如,单位、检测限(。由于神奇的"单位"包,单位很容易,但检测极限可能也应该直接附加到观测中,但我不清楚如何最好地做到这一点。

假设我们得到的结果低于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包来解决它。也许我只是想把它作为一个值的属性,而不是一个额外的列,这是找错树了。

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

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

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

这里有一个相当天真但功能强大的例子:

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包于2020-04-29创建(v0.3.0(

最新更新