Как проверить существование столбца в файле данных пера «перед» чтением в R? - PullRequest
0 голосов
/ 09 марта 2020

Мне нужно прочитать файл данных в формате пера с предопределенным набором столбцов. Выдает ошибку, если столбец не существует в файле данных. Как это проверить "до" чтения набора данных

library(feather)

# 1. Data set
df_mtcars <- mtcars

# 2. Drop column
df_mtcars$mpg <- NULL

# 3. Save data
write_feather(df_mtcars, "df_mtcars")

# 4. How check column existance in file 'before' reading
if(!is.null(...)) {
  read_feather("df_mtcars", columns = c("mpg"))
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вот функция, которую я разработал для решения этой проблемы

#' Check if column exist in feather file
#' @param file_name path to the feather file
#' @param column_name name of column to check
#' @return logical value 'TRUE' if 'column_name' exist in file
is_column_feather_file <- function(file_name, column_name) {

  # 1. Init result
  result <- FALSE

  # 2. Read meta data and search for 'column_name'
  if(file.exists(file_name) & (column_name != "") & !is.null(column_name)) {

    # 2. 1. Meta data
    df_meta_data <- feather_metadata(file_name)

    # 2.2. Check if column exists
    result <- sum(names(df_meta_data$types) == column_name) == 1

  }

  # 3. Return result
  result

}


# Test
is_column_feather_file("mt_cars", "mpg")
1 голос
/ 09 марта 2020

feather - это двоичный формат файла. Если вы посмотрите на исходный код read_feather, он читает файл целом в память, вызывая feather(path), а затем выбирает нужные столбцы. Посмотрите:

read_feather
#> function (path, columns = NULL) 
#> {
#>     data <- feather(path)
#>     on.exit(close(data), add = TRUE)
#>     if (is.null(columns)) 
#>         as_tibble(data)
#>     else as_tibble(data[columns])
#> }
#> <bytecode: 0x376de188>
#> <environment: namespace:feather>

Имена (несжатых) столбцов в файле , но они не находятся в надежных местах, потому что они появляются после полей данных переменной длины, поэтому нет способ просто прочитать небольшую часть двоичного файла и получить имена.

Поэтому лучше всего сделать что-то подобное, что сначала проверяет наличие указанного столбца:

read_feather_column <- function(path, column) 
{
  df <- feather(path)
  if(hasName(df, column)) 
    return(as_tibble(df[column]))
}
...