Нужно читать некоторые (или все) столбцы как .character при объединении нескольких файлов .csv с функциями tidyr - PullRequest
0 голосов
/ 30 ноября 2018

Я читаю много больших файлов .csv с одинаковыми именами столбцов и связываю их с помощью следующего кода (как предложено в https://serialmentor.com/blog/2016/6/13/reading-and-combining-many-tidy-data-files-in-R):

require(readr)  # for read_csv()
require(purrr)  # for map(), reduce()

# find all file names ending in .csv 
files <- dir(pattern = "*.csv")
files

data <- files %>%
  map(read_csv) %>%    # read in all the files individually, using
                   # the function read_csv() from the readr package
  reduce(rbind)        # reduce with rbind into one dataframe
data

Однако у моих данных есть один столбец, который нуждается вдля чтения в as.character, потому что в нем есть записи числовых строк, разделенных ",", а в противном случае read_csv превращает этот столбец в числовой без запятых.

Как я могу

1.) Укажите, чтобы читать только в одном столбце (желательно по имени) as.character?

или

2.) Просто читать во всех столбцах как .character?

ThisВторой вариант не идеален, так как тогда я должен изменить многие столбцы обратно на числовые.

Я попытался использовать:

col_types = cols(.default = "c")

, как обсуждалось в https://github.com/tidyverse/readr/issues/148 и https://github.com/tidyverse/readr/issues/292.

Мой подход был такой:

data <- files %>%
   map(read_csv( col_types = cols(.default = "c" ))) %>%
   reduce(rbind)   
data

Однако это не работает, потому что тогда read_csv () хочет ввод 'x' (то есть путь к файлу .csv).Выдает эту ошибку:

Error in read_delimited(file, tokenizer, col_names = col_names, col_types = col_types,  : 
  argument "file" is missing, with no default

1 Ответ

0 голосов
/ 02 декабря 2018

Девять (или другое число) столбцов с одинаковыми именами столбцов для каждого файла .csv, только два столбца (в данном случае «start_scan» и «end_scan») должны читаться как числовые, все остальные как символ:

files <- dir(pattern = "*.csv")

metadata <- files %>%
  map_df(~read_csv(., col_types = cols(.default = "c", 
    scan_end = "n", scan_start = "n") ))
...