Ошибка map_df для всех файлов в папке с использованием R

#r #csv #tidyverse #purrr

#r #csv #tidyverse #мурлыканье

Вопрос:

Итак, у меня есть папка с файлами, каждый из которых «почти» идентичен CSV. Каждый из них выглядит примерно так:

 EMP ID  WORK DATE   WORK HOURS   JOB TITLE  MGMT CTR
  002    01/02/2019          8     Janitor        44
  003    01/03/2019         29     Analyst       044
  004    01/02/2019        400      Barber         2
   ...
  

Я говорю «почти», потому что у некоторых из них есть несколько дополнительных переменных, но меня интересуют только две из них.

Используя следующий код, я теоретически могу объединить и сгруппировать их вместе на основе WORK DATE и WORK HRS (две переменные, о которых я забочусь).

 test <- list.files(path = "path", full.names = TRUE) %>%
  map_dfr(read.csv) %>%
  select(WORK.DATE,WORK.HRS) %>% 
  group_by(WORK.DATE) %>%
  summarize(hour_sum = sum(WORK.HRS)) 
  

Я делаю это и получаю сообщение об ошибке:

 Error: Can't combine `..1$JOB.NUM` <double> and `..2$JOB.NUM` <character>.
  

Похоже, что эти переменные взяты из одного или двух нечетных файлов. Но они мне не нужны, и я думал, что оператор select будет help…it не удалось. Я пробовал с readr ‘s read_csv .

 test <- list.files(path = "path", full.names = TRUE) %>%
    map_dfr(read_csv) %>%
    select(`WORK DATE`,`WORK HRS`) %>% 
  group_by(`WORK DATE`) %>%
    summarize(hour_sum = sum(`WORK HRS`)) 
  

И получаем аналогичную ошибку:

 Error: Can't combine `MGMT CTR` <double> and `MGMT CTR` <character>.
  

На самом деле меня интересуют только эти две переменные, и пока WORK DATE это символ или дата, а WORK HRS это целое число, у нас все хорошо.

Ответ №1:

Проблема может заключаться в том, что в некоторых наборах данных есть столбцы, которые не соответствуют типу. Одним из вариантов было бы преобразовать в один тип внутри map_df , а затем изменить тип

 library(dplyr)
library(purrr)
library(readr)
library(lubridate)
list.files(path = "path", full.names = TRUE) %>%
     map_dfr(~ read_csv(.x) %>% 
                  mutate(across(everything(), as.character))) %>% 
     select(`WORK DATE`,`WORK HRS`) %>% 
     type.convert(as.is = TRUE) %>%
     group_by(`WORK DATE` = mdy(`WORK DATE`)) %>%
     summarize(hour_sum = sum(`WORK HRS`)) # assume that "WORK HRS" is numeric
  

Комментарии:

1. хорошо, это исправлено! Но теперь, когда у меня есть этот df с названием «test», как мне указать «РАБОЧУЮ ДАТУ» в качестве формата даты?

2. @JohnThomas — это формат в месяц, день, год или день, месяц, год

3. Месяц, день, год, 01/01/2019

4. Также может быть лучше select внутри map_dfr