`collect` не может обрабатывать имена строк - PullRequest
0 голосов
/ 24 мая 2018
allcsvs = list.files(pattern = "*.csv$", recursive = TRUE)

library(tidyverse)

##LOOP to redact the snow data csvs##
for(x in 1:length(allcsvs)) {
  df = read.csv(allcsvs[x], check.names = FALSE)

  newdf = df %>%
    gather(COL_DATE, SNOW_DEPTH, -PT_ID, -DATE) %>%
    mutate( 
      DATE = as.Date(DATE,format = "%m/%d/%Y"),
      COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
    ) %>%
    filter(DATE == COL_DATE) %>%
    select(-COL_DATE)

  ####TURN DATES UNAMBIGUOUS HERE####
  df$DATE = lubridate::mdy(df$DATE)
  finaldf = merge(newdf, df, all.y = TRUE)
  write.csv(finaldf, allcsvs[x])

  df = read.csv(allcsvs[x])
  newdf = df[, -grep("X20", colnames(df))]
  write.csv(newdf, allcsvs[x])
}

Я использую приведенный выше код, чтобы построчно заполнять новый столбец, используя значения из различных существующих столбцов, используя дату в качестве критерия выбора.Если я вручную открою каждый .csv в Excel и удаляю первый столбец, этот код прекрасно работает.Однако, если я запускаю его на .csvs "как есть"

, я получаю следующее сообщение:

Error: Column 1 must be named

Пока я пытался поставить -rownames в скобках gather я пытался поставить remove_rownames %>% ниже newdf = df %>%, но, похоже, ничего не работает.Я попытался прочитать csv без первого столбца [,-1] или удалить первый столбец в R df[,1]<-NULL, но по какой-то причине, когда я это делаю, мой код возвращает пустую таблицу вместо того, что я хочу. Другими словами, я могу удалить имена строк в Excel, и это прекрасно работает, если я удаляю их в R, происходит что-то необычное.

Вот некоторые примеры данных: https://drive.google.com/file/d/1RiMrx4wOpUdJkN4il6IopciSF6pKeNLr/view?usp=sharing

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете импортировать их с помощью readr::read_csv.

Простое решение с tidyverse:

allcsvs %>%
            map(read_csv) %>% 
            reduce(bind_rows) %>%
            gather(COL_DATE, SNOW_DEPTH, -PT_ID, -DATE) %>% 
            mutate( 
                            DATE = as.Date(DATE,format = "%m/%d/%Y"),
                            COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
            ) %>%
            filter(DATE == COL_DATE) %>%
            select(-COL_DATE)

С utils::read.csv вы импортируете строки, которые являются факторами.as.Date(DATE,format = "%m/%d/%Y") оценивает NA.

Обновление

Приведенное выше решение возвращает один единственный кадр данных.Чтобы записать каждый файл данных отдельно с помощью цикла for:

for(x in 1:length(allcsvs)) {
  read_csv(allcsvs[x]) %>% 
    gather(COL_DATE, SNOW_DEPTH, -PT_ID, -DATE) %>% 
    mutate( 
      COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
    ) %>%
    filter(DATE == COL_DATE) %>%
    select(-COL_DATE) %>%
    write_csv(paste('tidy', allcsvs[x], sep = '_'))
}

Сравнение

  • purrr:map и purrr:reduce можно использовать вместоцикл в некоторых случаях.Эти функции принимают другие функции в качестве аргументов.
  • readr::read_csv обычно в 10 раз быстрее, чем базовые эквиваленты R.(Подробнее: http://r4ds.had.co.nz/data-import.html). Также он может лучше обрабатывать файлы CSV.
...