在 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 创建
我有一个庞大而复杂的水质数据集,我正试图将其从 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 创建