Применение одного и того же кода к нескольким файлам .csv - PullRequest
0 голосов
/ 27 октября 2018

У меня есть несколько файлов .csv в одном и том же формате перекачки томов каждую минуту. Мне нужно собрать суммарные объемы закачки за каждый день. Некоторые из данных имеют текстовые ошибки (регистратор данных отключен) или отрицательные значения (означает, что поток был равен 0). Я написал код ниже, чтобы сделать это. Как я могу сделать это для нескольких файлов вместо копирования и вставки для каждого месяца? Все файлы имеют пометку «Mon_Year_Well_Flows.csv». Я попытался использовать цикл for и использовать lapply безуспешно. Кроме того, я очень плохо знаком с R, поэтому я понимаю, что мой код, вероятно, очень неэффективен.

Первые строки файла данных первого месяца "Jul_2017_Well_Flows.csv"

Date        DW_20   DW_24A  DW_25A   DW_26A DW_27A  DW_28   DW_29
9/1/18 0:00 995.88  1110.62 1229.14  -0.09  4.5    1100.95  913.33
9/1/18 0:01 1002.43 1115.85 1231.59  -0.09  4.5    1107.63  909.06
9/1/18 0:02 1007.01 1123.39 1236.75  -0.09  4.51   1108.37  935
9/1/18 0:03 1007.17 1121.69 1234.58  -0.09  4.52   1105.64  901.35
9/1/18 0:04 1005.27 1122.86 1233.25  -0.09  4.53   1107.56  911.15
9/1/18 0:05 1001.37 1116.39 1229.89  -0.09  4.54   1103.66  937.93

Код для файла данных первого месяца

#Load data
data <- read.csv("Jul_2017_Well_Flows.csv", header = T)
#Create new data frame with date info
data1 <- data.frame("Date" = data$Date)
#Remove all error text to NA
index <- supply(data, is.factor)
data[index] <- apply(data[index], function(x) as.numeric(as.character(x)))
#Convert all NA values to 0
data[is.na(data)] <- 0
#Converting all negative pumping rates to 0
data[,-c(1)][data[,-c(1)]<0] <-0
#Add back original date column
data <- select(data, -Date)
data <- bind_cols(data,data1)
#Remove minute data and change day to date formatting
data$Day <- as.Date(data$Date, '%m/%d/%Y')
Jul_2017 <- data %>%
  #Remove date column
  select(-Date) %>%
  #Group all data according to day
  group_by(day) %>%
  #Sum all daily well data by day
  summarize_all(sum)

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

combined <- bind_rows(Jul_2017, Aug_2017....)

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Мне пришлось немного изменить ваш код, так как в нем было несколько ошибок.

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

library(dplyr)

process_csv <- function(file) {
  #Load data
  data <- read.csv(file, header = TRUE, stringsAsFactors = FALSE)
  #Create new data frame with date info
  data$Date <- as.POSIXlt.character(data$Date, format = "%m/%d/%Y %H:%M", tz = "GMT")
  #Remove all error text to NA
  numeric_columns <- 2:ncol(data)
  for (c in numeric_columns) {
    # convert character class columns to numeric
    # NAs are coerced where data is missing (will generate warning)
    data[, c] <- as.numeric(data[, c])
    #Convert all NA values to 0
    data[is.na(data[, c]), c] <- 0
    #Converting all negative pumping rates to 0
    data[data[, c] < 0, c] <- 0
  }
  #Remove minute data and change day to date formatting
  data$Day <- as.Date(data$Date, '%m/%d/%Y')
  out <- data %>%
    #Remove date column
    select(-Date) %>%
    #Group all data according to day
    group_by(Day) %>%
    #Sum all daily well data by day
    summarize_all(sum)
   return(out)
}

Затем вы можетеиспользуйте list.files() для поиска в папке .csv файлов:

folder <- "C:/path/to/your/data/"

files <- list.files(path = folder, pattern = ".csv$", full.names = TRUE)

Затем вы можете использовать lapply() для циклического просмотра файлов и применения функции к каждому из них.

# loop over files
combined <- lapply(files, process_csv) %>% 
  bind_rows()
0 голосов
/ 27 октября 2018

Я собираюсь ответить на этот вопрос:

Как я могу зациклить это на нескольких файлах вместо копирования и вставки для каждого месяца?

Для начала, один из методов - сначала получить список имен файлов в этом каталоге.Попробуйте:

filenames <- list.files("temp", pattern="*.csv", full.names=TRUE)


#Load data
data <- read.csv(filenames[[1]], header = T) # read in the first file as usual


#Create new data frame with date info
data1 <- data.frame("Date" = data$Date)
#Remove all error text to NA
index <- supply(data, is.factor)
data[index] <- apply(data[index], function(x) as.numeric(as.character(x)))
#Convert all NA values to 0
data[is.na(data)] <- 0
#Converting all negative pumping rates to 0
data[,-c(1)][data[,-c(1)]<0] <-0
#Add back original date column
data <- select(data, -Date)
data <- bind_cols(data,data1)
#Remove minute data and change day to date formatting
data$Day <- as.Date(data$Date, '%m/%d/%Y')
Jul_2017 <- data %>%
  #Remove date column
  select(-Date) %>%
  #Group all data according to day
  group_by(day) %>%
  #Sum all daily well data by day
  summarize_all(sum)


#I'm not sure if you can use bind_rows with one argument - I am not able
# to test code at the moment. Create a storage place for the combined dfs.
combined <- bind_rows(Jul_2017)

for (i in 2:len(filenames)) {
temp_month <- read.csv(filenames[[i]], header = TRUE) # Notice the temp_month

#Load data
data <- read.csv(filenames[[1]], header = T) # read in first file as usual
#Create new data frame with date info
data1 <- data.frame("Date" = data$Date)
#Remove all error text to NA
index <- supply(data, is.factor)
data[index] <- apply(data[index], function(x) as.numeric(as.character(x)))
#Convert all NA values to 0
data[is.na(data)] <- 0
#Converting all negative pumping rates to 0
data[,-c(1)][data[,-c(1)]<0] <-0
#Add back original date column
data <- select(data, -Date)
data <- bind_cols(data,data1)
#Remove minute data and change day to date formatting
data$Day <- as.Date(data$Date, '%m/%d/%Y')
temp_month <- data %>%
  #Remove date column
  select(-Date) %>%
  #Group all data according to day
  group_by(day) %>%
  #Sum all daily well data by day
  summarize_all(sum)

combined <- bind_rows(combined, temp_month)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...