From d94489e6a32ed9f1f366985c33aeaa1cbbe28807 Mon Sep 17 00:00:00 2001 From: Collin Schwantes Date: Wed, 28 Aug 2024 12:13:05 -0600 Subject: [PATCH] adding function for expanding fl metadata --- R/expand_frictionless_metadata.R | 96 +++++++++++++++++++++++++++++ man/expand_frictionless_metadata.Rd | 62 +++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 R/expand_frictionless_metadata.R create mode 100644 man/expand_frictionless_metadata.Rd diff --git a/R/expand_frictionless_metadata.R b/R/expand_frictionless_metadata.R new file mode 100644 index 0000000..3bd74dd --- /dev/null +++ b/R/expand_frictionless_metadata.R @@ -0,0 +1,96 @@ +#' Expand Frictionless Metadata with structural metadata +#' +#' Loops over elements in the structural metadata and adds them to frictionless +#' metadata schema. +#' +#' @param structural_metadata Dataframe. Structural metadata from +#' `create_structural_metadata` or `update_structural_metadata` +#' @param resource_name Character. Item within the datapackage to be updated +#' @param resource_path Character. Path to csv file +#' @param data_package_path Character. Path to datapackage.json file +#' +#' @return Updates the datapackage, returns nothing +#' @export +#' +#' @examples +#' \dontrun{ +#' +#' # read in file +#' data_path <- "my/data.csv" +#' data <- read.csv(data_path) +#' +#' # create structural metadata +#' data_codebook <- create_structural_metadata(data) +#' +#' # update structural metadata +#' write.csv(data_codebook,"my/codebook.csv", row.names = FALSE) +#' +#' data_codebook_updated <- read.csv(""my/codebook.csv"") +#' +#' # create frictionless package - this is done automatically with the +#' # deposits package +#' my_package <- +#' create_package() |> +#' add_resource(resource_name = "data", data = data_path) +#' +#' write_package(my_package,"my") +#' +#' expand_frictionless_metadata(structural_metadata = data_codebook_updated, +#' resource_name = "data", +#' resource_path = data_path, +#' data_package_path = "my/datapackage.json" +#' ) +#' +#' } +#' +expand_frictionless_metadata <- function(structural_metadata, + resource_name, + resource_path, + data_package_path ){ + + data_package <- frictionless::read_package(data_package_path) + + data_package_dir <- dirname(data_package_path) + + # get the schema for a resource in the data package + my_data_schema <- data_package|> + frictionless::get_schema(resource_name) + + ## build up schema based on structural metadata + + for(idx in 1:length(my_data_schema$fields)){ + # item to build out + x <- my_data_schema$fields[[idx]] + for(idy in 1:length(structural_metadata)){ + + y <- structural_metadata[idx,idy][[1]] + # get property name + property_to_add_name <- names(structural_metadata)[idy] + + # skip properties that already exist + if(property_to_add_name %in% names(x)){ + next() + } + + property_to_add_value <- y + names(property_to_add_value) <- property_to_add_name + x <- c(x, property_to_add_value) + } + + # update + my_data_schema$fields[[idx]] <- x + } + + # update the datapackage.json + data_package <- data_package|> + frictionless::remove_resource(resource_name) |> + frictionless::add_resource(resource_name = resource_name, + data = "data_examples/my_data.csv", + schema = my_data_schema, + ) + + # write the datapackage.json + frictionless::write_package(data_package,directory = data_package_dir) + + invisible() +} diff --git a/man/expand_frictionless_metadata.Rd b/man/expand_frictionless_metadata.Rd new file mode 100644 index 0000000..58e5bad --- /dev/null +++ b/man/expand_frictionless_metadata.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/expand_frictionless_metadata.R +\name{expand_frictionless_metadata} +\alias{expand_frictionless_metadata} +\title{Expand Frictionless Metadata with structural metadata} +\usage{ +expand_frictionless_metadata( + structural_metadata, + resource_name, + resource_path, + data_package_path +) +} +\arguments{ +\item{structural_metadata}{Dataframe. Structural metadata from +\code{create_structural_metadata} or \code{update_structural_metadata}} + +\item{resource_name}{Character. Item within the datapackage to be updated} + +\item{resource_path}{Character. Path to csv file} + +\item{data_package_path}{Character. Path to datapackage.json file} +} +\value{ +Updates the datapackage, returns nothing +} +\description{ +Loops over elements in the structural metadata and adds them to frictionless +metadata schema. +} +\examples{ +\dontrun{ + +# read in file +data_path <- "my/data.csv" +data <- read.csv(data_path) + +# create structural metadata +data_codebook <- create_structural_metadata(data) + +# update structural metadata +write.csv(data_codebook,"my/codebook.csv", row.names = FALSE) + +data_codebook_updated <- read.csv(""my/codebook.csv"") + +# create frictionless package - this is done automatically with the +# deposits package +my_package <- + create_package() |> + add_resource(resource_name = "data", data = data_path) + + write_package(my_package,"my") + +expand_frictionless_metadata(structural_metadata = data_codebook_updated, + resource_name = "data", + resource_path = data_path, + data_package_path = "my/datapackage.json" + ) + +} + +}