#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