Чтение нескольких файлов, извлечение определенного столбца, удаление определенной строки и запись в несколько новых файлов - PullRequest
1 голос
/ 27 мая 2020

У меня есть тысячи файлов с расширением .txt, с пробелами ("") в качестве разделителей в общей папке. Мне нужно:

  1. Извлечь определенные столбцы. Мне нужно удалить последний столбец и, например, выбрать только столбцы 1,2,3 и 7. Я уже писал этот код с l oop:
    # Setting working directory
    workingdirectory <- "D:/FolderContainsThousandsFile"
    setwd(workingdirectory)

    # Listing the files in the folder with .txt extension
    FilesList <- list.files(workingdirectory, pattern = ".txt$")
    numberFiles <- length(FilesList)

    # Looping for all files
    for(f in 1:numberFiles){
    # read the file into tables
    FilterFile <- FilesList [f] %>% read.csv(sep = "", header = FALSE, stringsAsFactors = FALSE) %>% dplyr::select(-ncol(.)) # remove the last column
Удалить определенную строку. Файл содержит ежедневные данные о погоде за несколько лет, затем мне нужно удалить все данные 29 февраля с помощью этого кода:
    # Remove the 29th day in February
    columnNames <- c("year", "month", "day", "weather")
    FilterFile <- FilterFile %>% rename_at(c(1,2,3,7), ~columnNames) # renaming columns to indicate the column to be taken
    FilterFile <- FilterFile %>% filter(month != 2 | day != 29)
Наконец, мне нужно экспортировать результат из пунктов 1) и 2), чтобы он был уникальным .txt-файлом из всех файлов, с именем нового файла в соответствии с исходным файлом (пример: before_file1.txt в after_file1.txt) для каждого файла.

Правильно ли я поступаю? Пожалуйста, помогите, если вы знаете каждый из шагов для этого.

Заранее благодарю

1 Ответ

0 голосов
/ 27 мая 2020

Вы можете использовать:

library(dplyr)
columnNames <- c("year", "month", "day", "weather")
FilesList <- list.files(workingdirectory, pattern = "\\.txt$", full.names = TRUE)


purrr::map(FilesList, ~{
     .x %>%
       #Read csv file
       read.csv(sep = "", header = FALSE, stringsAsFactors = FALSE) %>% 
       #Remove Last column
       select(-ncol(.)) %>%
       #Rename at particular position with columnNames
       rename_at(c(1,2,3,7), ~columnNames) %>%
       #Remove 29th Februaury
       filter(month != 2 & day != 29) %>%
       #Write the data back
       write.csv(paste0('after', basename(.x)), row.names = FALSE)
})

Если у вас нет очень веской причины для записи данных в текстовый файл, я бы предложил вместо этого записывать данные в csv.

...