Как передать список строк в пользовательскую функцию? - PullRequest
0 голосов
/ 17 октября 2019

Я написал простую функцию, которая берет файл Excel и выполняет некоторую очистку данных. Однако я должен повторить это для всех файлов, содержащихся в папке. Пока что функция работает с одним файлом, но когда я перебираю список, я получаю ошибки, перечисленные ниже, и выводятся только некоторые кадры данных (должно быть выведено 333 таблицы). Цель проекта - собрать все файлы Excel, очистить данные, объединить все DF и затем отправить их в базу данных.

library(readxl)
library(tidyr)
library(MESS)
library(stringr)

udFunction <- function(loc) {

  test <- read_excel(loc) #read location
  test <- test[-c(1:7),] #removes first 7 rows
  names(test) <- test[1,] #makes the first row into column name
  test <- test[-1,] #removes first row since it's copied to column name

  #Rename all column names
  names(test)[1] = "Time"
  names(test)[2] = "Sample"
  names(test)[3] = "Rename"
  names(test)[4] = "Test"
  names(test)[5] = "Test2"
  names(test)[6] = "Test3"
  names(test)[7] = "Test4"
  names(test)[8] = "Test5"
  names(test)[9] = "Test6"
  names(test)[10] = "Test7"
  names(test)[11] = "Test8"
  names(test)[12] = "Test9"
  names(test)[13] = "Test10"
  names(test)[14] = "Test11"
  names(test)[15] = "Test12"
  names(test)[16] = "Test13"
  names(test)[17] = "Test14"
  names(test)[18] = "Test15"
  names(test)[19] = "Test16"

  #Copy Time column to NewColumn
  test %<>% 
    mutate(NewColumn = Time) %>%
    mutate(Date = str_extract(loc, "\\d{6}")) #loc is from the path name

  test$NewColumn <- str_replace(test$NewColumn, "\\d", NA_character_) %>%
    filldown() #replaces any string without digits with NA

  test %<>%
     filter(!str_detect(test$Time, "[A-Za-z]"))  #filters anything with characters

}

loc <- "C:/PATH.../.../2019"
files = list.files(path = loc, pattern = ".xls$", full.names = TRUE) #files is a list of 333 path names. 

for (i in files) {
  cast = paste("CC", i, sep = "_")
  try(assign(cast, udFunction(i)))
}

Я ожидаю, что кадры данных для всех файлов будут выводиться, однако я продолжаю получать одно и то же Error in attr(x, "names") <- as.character(value) : 'names' attribute [1] must be the same length as the vector [0].

Я предполагаю, что это как-то связано с переименованиемимена столбцов. Опять же, все это работает, когда я пробую это одно за другим, но когда я пытаюсь создать функцию, а затем перебрать список путей, я получаю ошибку выше.

1 Ответ

0 голосов
/ 17 октября 2019

Вот предложение:

udFunction <- function(loc) {

  # read your excel file, skip the column names as you don't need them, and skip the first 8 rows
  test <- read_excel(loc, col_names = F, skip = 8)

  # rename your columns
  colnames(test) <- c("Time", "Sample", "Rename", "Test", paste0("Test", c(2:16)))


  #Copy Time column to NewColumn
  test %<>% 
    mutate(NewColumn = Time) %>%
    mutate(Date = str_extract(loc, "\\d{6}")) #loc is from the path name

  test$NewColumn <- str_replace(test$NewColumn, "\\d", NA_character_) %>%
    filldown() #replaces any string without digits with NA

  test %<>%
     filter(!str_detect(test$Time, "[A-Za-z]"))  #filters anything with characters

  return(test)

}

# list your xls files
files <- list.files(path = "C:/PATH.../.../2019", pattern = ".xls", full.names = TRUE) 

# use lapply to iterate the function over your files. This returns a list of data frames
lapply(files, udFunction)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...