Как добавить метаданные в таблицу
Как добавить метаданные в таблицу?
Я хотел бы предложение, описывающее каждое из моих имен переменных, чтобы я мог распечатать таблицу со связанными метаданными, и если бы я вручил ее кому-то, кто раньше не видел данные, они могли бы в этом разобраться.
as_tibble(iris)
# A tibble: 150 × 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fctr>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
# ... with 140 more rows
# Sepal.length. Measured from sepal attachment to stem
# Sepal.width. Measured at the widest point
# Petal.length. Measured from petal attachment to stem
# Petal.width. Measured at widest point
# Species. Nomenclature based on Integrated Taxonomic Information System (ITIS), January 2018.
Спасибо!
3 ответа
Это кажется хитрым. В принципе, комментарий @hrbrmstr - это то, что нужно ?comment
или же ?attr
добавить атрибуты к любому объекту), но эти атрибуты не будут распечатаны по умолчанию. Кажется, что атрибуты распечатываются автоматически для атомарных объектов:
> z <- 1:6
> attr(z,"hello") <- "goodbye"
> z
[1] 1 2 3 4 5 6
attr(,"hello")
[1] "goodbye"
... но, увы, не для фреймов данных или тибблов:
dd <- tibble::data_frame(x=1:4,y=2:5)
> attr(dd,"metadata") <- c("some stuff","some more stuff")
> dd
# A tibble: 4 x 2
x y
<int> <int>
1 1 2
2 2 3
3 3 4
4 4 5
Вы можете обернуть объект своим собственным классом S3, чтобы напечатать этот материал:
class(dd) <- c("my_tbl",class(dd))
> print.my_tbl <- function(x) {
+ NextMethod(x)
+ print(attr(x,"metadata"))
+ invisible(x)
+ }
> dd
# A tibble: 4 x 2
x y
<int> <int>
1 1 2
2 2 3
3 3 4
4 4 5
[1] "some stuff" "some more stuff"
Вы можете сделать печать более сложной или красивой, например,
cat("\nMETADATA:\n")
cat(sprintf("# %s",attr(x,"metadata")),sep="\n")
Ничего плохого не произойдет, если другой пользователь не определил print.my_tbl
(метод печати будет использовать метод печати для столбцов), но метаданные будут напечатаны только при наличии print.my_tbl
определение...
Приносим извинения за задержку с ответом. Но эта тема меня беспокоит с тех пор, как я впервые начал изучать R. В моей работе назначение метаданных столбцам - не просто обычное дело. Требуется. То, что у R, похоже, не было хорошего способа сделать это, меня действительно беспокоило. Настолько, что я написал несколько пакетов для этого.
В пакете fmtr есть функция для назначения описаний (а также прочего). А в пакете libr есть функция словаря, поэтому вы можете просматривать все назначенные вами метаданные.
Вот как это работает:
Сначала присвойте описания столбцам. Вы просто отправляете именованный список в
descriptions()
функция.
library(fmtr)
library(libr)
# Create data frame
df <- iris
# Assign descriptions
descriptions(df) <- list(Sepal.Length = "Measured from sepal attachment to stem",
Sepal.Width = "Measured at the widest point",
Petal.Length = "Measured from petal attachment to stem",
Petal.Width = "Measured at the widest point",
Species = paste("Nomanclature based on Integrated Taxonomic",
"Information System (ITIS), January 2018."))
Затем вы можете увидеть все метаданные, вызвав
dictionary()
функция, например:
dictionary(df)
# # A tibble: 5 x 10
# Name Column Class Label Description
# <chr> <chr> <chr> <chr> <chr>
# 1 df Sepal.Leng~ numer~ NA Measured from sepal attachment to stem
# 2 df Sepal.Width numer~ NA Measured at the widest point
# 3 df Petal.Leng~ numer~ NA Measured from petal attachment to stem
# 4 df Petal.Width numer~ NA Measured at the widest point
# 5 df Species factor NA Nomanclature based on Integrated Taxonomic Information Syst~
Если хотите, вы можете вернуть словарь как отдельный фрейм данных, затем сохранить его, распечатать или что-то еще.
d <- dictionary(df)
Вот фрейм данных словаря:
Это не так сильно отличается от предложений Бена Болкера, но концептуально, если я хочу, чтобы информация была связана с векторами в моем фрейме данных, я бы предпочел, чтобы они были напрямую связаны с векторами. Другими словами, я бы предпочел добавить атрибуты к самим векторам, а не к объекту фрейма данных.
Я не знаю, что я бы зашел так далеко, чтобы добавить пользовательский класс к объекту, но, возможно, подойдет отдельная функция, которую вы можете вызвать для объекта, подобного фрейму данных:
library(tibble)
library(ggplot2)
library(magrittr)
library(labelVector)
print_with_label <- function(dframe){
stopifnot(inherits(dframe, "data.frame"))
labs <- labelVector::get_label(dframe, names(dframe))
labs <- sprintf("%s: %s", names(dframe), labs)
print(dframe)
cat("\n")
cat(labs, sep = "\n")
}
iris <-
as_tibble(iris) %>%
set_label(Sepal.Length = "This is a user friendly label",
Petal.Length = "I much prefer reading human over computer")
print_with_label(iris)
mtcars <-
set_label(mtcars,
mpg = "Miles per Gallon",
qsec = "Quarter mile time",
hp = "Horsepower",
cyl = "Cylinders",
disp = "Engine displacement")
print_with_label(mtcars)