将自定义函数应用于多个文件并在R中创建唯一的csv输出

将自定义函数应用于多个文件并在R中创建唯一的csv输出,r,function,csv,R,Function,Csv,我是R的初学者,一直在编译代码来创建自定义函数,以便对我拥有的某些数据执行特定任务。自定义函数用于识别csv文件中缺少的数据,并使用平均值对此进行修补。此后,我想按年份和月份汇总数据,并将其导出为csv文件。我有多个csv文件位于一个文件夹中,希望对每个文件执行此任务。到目前为止,我能够获得执行手头任务的代码,但不知道如何为已处理的每个csv文件编写唯一的输出,并将其保存到新文件夹中。我还希望在处理后的输出中保留原始文件名,但在其后面附加“\u processed”字样。此外,任何关于如何改进此

我是R的初学者,一直在编译代码来创建自定义函数,以便对我拥有的某些数据执行特定任务。自定义函数用于识别csv文件中缺少的数据,并使用平均值对此进行修补。此后,我想按年份和月份汇总数据,并将其导出为csv文件。我有多个csv文件位于一个文件夹中,希望对每个文件执行此任务。到目前为止,我能够获得执行手头任务的代码,但不知道如何为已处理的每个csv文件编写唯一的输出,并将其保存到新文件夹中。我还希望在处理后的输出中保留原始文件名,但在其后面附加“\u processed”字样。此外,任何关于如何改进此代码的建议都是非常受欢迎的。提前谢谢

# Load all packages required by the script
library(tidyverse) # data science package
library(lubridate) # work with dates
library(dplyr)     # data manipulation (filter, summarize, mutate)
library(ggplot2)   # graphics
library(gridExtra) # tile several plots next to each other
library(scales)

# Set the working directory #
setwd("H:/Shaeden_Post_Doc/Genus_Exchange/GEE_Data/MODIS_Product_Data_Raw/Cold_Temperate_Moist")


#create a function to summarize data by year and month
#patch missing values using the average

summarize_by_month = function(df){
  
# counting unique, missing and mean values in the ET column
df %>% summarise(n = n_distinct(ET),
                   na = sum(is.na(ET)),
                   med = mean(ET, na.rm = TRUE))
  
# assign mean values to the missing data and modify the dataframe
df = df %>%
    mutate(ET = replace(ET,is.na(ET),mean(ET, na.rm = TRUE)))
df
  
#separate data into year, month and day  
df$date = as.Date(df$date,format="%Y/%m/%d")

#summarize by year and month 

df %>%
    mutate(year = format(date, "%Y"), month = format(date, "%m")) %>%
    group_by(year, month) %>%
    summarise(mean_monthly = mean(ET))

}

#import all files and execute custom function for each
file_list = list.files(pattern="AET", full.names=TRUE)
file_list

my_AET_files = lapply(file_list, read_csv)
monthly_AET = lapply(my_AET_files, summarize_by_month)
monthly_AET 
下面提供了到示例数据集的链接

path
path您可以在相同的功能中读取、操作数据和写入csv:

library(dplyr)

summarize_by_month = function(file) {
  df <- readr::read_csv(file)

  # assign mean values to the missing data and modify the dataframe
  df = df %>% mutate(ET = replace(ET,is.na(ET),mean(ET, na.rm = TRUE)))

  #separate data into year, month and day  
  df$date = as.Date(df$date,format="%Y/%m/%d")

  #summarize by year and month 
  new_df <- df %>%
    mutate(year = format(date, "%Y"), month = format(date, "%m")) %>%
    group_by(year, month) %>%
    summarise(mean_monthly = mean(ET))
  
     write.csv(new_df, sprintf('output_folder/%s_processed.csv', 
           tools::file_path_sans_ext(basename(file))), row.names = FALSE)
}

monthly_AET = lapply(file_list, summarize_by_month)
库(dplyr)
按月汇总=功能(文件){
df%突变(ET=replace(ET,is.na(ET),mean(ET,na.rm=TRUE)))
#将数据分为年、月和日
df$date=as.date(df$date,格式=“%Y/%m/%d”)
#按年度和月份汇总
新的_df%
变更(年=格式(日期,“%Y”)、月=格式(日期,“%m”))%>%
分组单位(年、月)%>%
总结(月平均值=平均值(ET))
write.csv(新的\u df,sprintf('output\u folder/%s\u processed.csv'),
工具::文件\u路径\u sans\u ext(basename(file)),row.names=FALSE)
}
每月(文件列表,按月汇总)

您可以在同一功能中读取、操作数据和写入csv:

library(dplyr)

summarize_by_month = function(file) {
  df <- readr::read_csv(file)

  # assign mean values to the missing data and modify the dataframe
  df = df %>% mutate(ET = replace(ET,is.na(ET),mean(ET, na.rm = TRUE)))

  #separate data into year, month and day  
  df$date = as.Date(df$date,format="%Y/%m/%d")

  #summarize by year and month 
  new_df <- df %>%
    mutate(year = format(date, "%Y"), month = format(date, "%m")) %>%
    group_by(year, month) %>%
    summarise(mean_monthly = mean(ET))
  
     write.csv(new_df, sprintf('output_folder/%s_processed.csv', 
           tools::file_path_sans_ext(basename(file))), row.names = FALSE)
}

monthly_AET = lapply(file_list, summarize_by_month)
库(dplyr)
按月汇总=功能(文件){
df%突变(ET=replace(ET,is.na(ET),mean(ET,na.rm=TRUE)))
#将数据分为年、月和日
df$date=as.date(df$date,格式=“%Y/%m/%d”)
#按年度和月份汇总
新的_df%
变更(年=格式(日期,“%Y”)、月=格式(日期,“%m”))%>%
分组单位(年、月)%>%
总结(月平均值=平均值(ET))
write.csv(新的\u df,sprintf('output\u folder/%s\u processed.csv'),
工具::文件\u路径\u sans\u ext(basename(file)),row.names=FALSE)
}
每月(文件列表,按月汇总)

感谢您的建议,它似乎是对函数的一个简单的添加,我肯定会使用它。我已指定csv文件将写入的输出文件夹的文件路径(在上面的代码中),然后重新运行代码,但现在收到以下错误“as.character(x)中的错误:无法将类型“closure”强制为“character”类型的向量”。是什么导致了这个错误?@shaedengool我通过添加
basename
更改了
write.csv
中最后一行代码。你能再运行一次并检查是否正确吗?@RounakShah。我已经根据您最近的建议修改了我的代码,请参见上文。前面的错误不再出现,但现在我收到以下错误“错误:
文件必须是字符串、原始向量或连接。”感谢您的帮助。@Shaedengool您需要读取函数内部的数据,而不是外部的
lapply
。查看我的更新答案,我将
文件列表
传递到
按月汇总
函数。@RounakShah。非常感谢,它工作得非常好。亲切的问候。谢谢你的建议,这似乎是一个相当简单的功能,并肯定是我想使用的东西添加。我已指定csv文件将写入的输出文件夹的文件路径(在上面的代码中),然后重新运行代码,但现在收到以下错误“as.character(x)中的错误:无法将类型“closure”强制为“character”类型的向量”。是什么导致了这个错误?@shaedengool我通过添加
basename
更改了
write.csv
中最后一行代码。你能再运行一次并检查是否正确吗?@RounakShah。我已经根据您最近的建议修改了我的代码,请参见上文。前面的错误不再出现,但现在我收到以下错误“错误:
文件必须是字符串、原始向量或连接。”感谢您的帮助。@Shaedengool您需要读取函数内部的数据,而不是外部的
lapply
。查看我的更新答案,我将
文件列表
传递到
按月汇总
函数。@RounakShah。非常感谢,它工作得非常好。亲切的问候。