0

我必须使用预定义的列集以羽毛格式读取数据文件。如果数据文件中不存在该列,则会生成错误。如何“在”读取数据集之前检查它

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"))
}

谢谢!

4

2 回答 2

1

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]))
}
于 2020-03-09T14:35:38.657 回答
1

这是我为解决此问题而设计的功能

#' 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")
于 2020-03-09T14:37:32.530 回答