Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 循环浏览CSV文件--为每个文件发布完成任务_R_Loops_Csv - Fatal编程技术网

R 循环浏览CSV文件--为每个文件发布完成任务

R 循环浏览CSV文件--为每个文件发布完成任务,r,loops,csv,R,Loops,Csv,我试图循环浏览多个CSV文件,并为每个文件完成相同的任务,以节省自己的时间。首先,我运行了“list.files”来列出文件夹中的所有文件,例如,GPS_Collar33800_13.csv、GPS_Collar33801_13.csv等。然后我开发了一个循环,但我正在努力研究如何构造代码的其他部分来处理每个单独的文件。我的最终目标是拥有24个结构相同的文件,然后我需要将它们合并到一个主文件中。另一个问题是,我需要为每个文件列出一个唯一的ID,为衣领ID添加列,例如338003380133802

我试图循环浏览多个CSV文件,并为每个文件完成相同的任务,以节省自己的时间。首先,我运行了“list.files”来列出文件夹中的所有文件,例如,GPS_Collar33800_13.csv、GPS_Collar33801_13.csv等。然后我开发了一个循环,但我正在努力研究如何构造代码的其他部分来处理每个单独的文件。我的最终目标是拥有24个结构相同的文件,然后我需要将它们合并到一个主文件中。另一个问题是,我需要为每个文件列出一个唯一的ID,为衣领ID添加列,例如338003380133802,等等。但我不知道如何在不手动添加新的唯一ID的情况下轻松完成此操作。如果我知道它首先引入了文件GPS\u Collar33800\u 13.csv,那么我可以使AnimalID列值=33800,并对GPS\u Collar33801\u 13.csv执行相同的操作,并添加AnimalID列值=33801。唯一ID基于文件名。任何建议都将不胜感激

 ## List CSV files in folder
`files<-list.files()`

## Run a for loop to complete the same tasks for each
for (i in 1:length(files)){
## Read table
tmp<-read.table(files[i],header=FALSE,sep=" ")
## Keep certain columns
tmp1 <- tmp[c(2:5,9,10,12,13)]
#Name the remaining columns
names(tmp1) <- 
c("GMT_Date","GMT_Time","LMT_Date","LMT_Time","Latitude","Longitude","PDOP","2D_3D")
#Add column for collar ID
tmp1$AnimalID<-33800
#Cleanup dataframe by removing records with NAs
tmp1[tmp1 == "N/A"]  <- NA
tmp2<-na.omit(tmp1)

您可以尝试一下:

library(stringr)
## List CSV files in folder
files<-list.files()

big.df <- vector('list',length(files))

## Run a for loop to complete the same tasks for each
for (i in 1:length(files)){
  ## Read table
  tmp<-read.table(files[i],header=FALSE,sep=" ")
  ## Keep certain columns
  tmp1 <- tmp[c(2:5,9,10,12,13)]
  #Name the remaining columns
  names(tmp1) <- 
    c("GMT_Date","GMT_Time","LMT_Date","LMT_Time","Latitude","Longitude","PDOP","2D_3D")
  #Add column for collar ID
  tmp1$AnimalID<-str_match(files[i], 'Collar(\\d+)_')[,2]
  #Cleanup dataframe by removing records with NAs
  tmp1[tmp1 == "N/A"]  <- NA
  tmp2<-na.omit(tmp1)
  big.df[[i]] <- tmp2

}
final.df <- do.call('rbind', big.df)
它需要stringr软件包,并假设您的文件名都像“GPS\u Collar33801\u 13.csv”等。然后它读取每个文件,将其存储在一个大列表中,并移动到下一个文件。。。完成后,它会将它们混合在一个名为final.df的data.frame中


编辑:刚刚修复了str_match参数

因此,在开始之前,让我确定我理解了提问:

对于文件夹中的每个文件, 将文件作为数据帧导入 删除一些列 重命名其余列 将数据框中的列设置为从文件名获得的值 在任意位置删除包含字符串N/A的案例 然后,通过合并将每个结果数据帧合并为一个数据帧,也就是说,将行添加到一起,因为列应该相同。 您必须提供数据来回答任何此类问题,这一点至关重要。如果你不能提供你的具体数据,那么就创建一些虚假的数据来证明你手头的问题。然后,提供一个示例,说明操作完成后它应该是什么样子。这减少了回答你问题的人的猜测

说了这么多,我们开始吧

让我们通过假设我们有一个名为process_a_file的函数来抽象任务1的子部分,该函数将执行每个文件的步骤1-5并返回一个数据帧。稍后我可以解释这个函数是如何工作的

对于每个文件部分,您需要lappy。lapply在您提供的列表的每个元素上运行给定函数,并返回函数返回内容的列表:

results_list <- lapply(files, process_a_file)
这就是你所需要做的

那么,现在,我们在进程文件中放了什么?这很简单-您的代码基本上已经完成了,但我更喜欢使用一些不同的方法:

process_a_file <- function(filename) {
    #???????
}
对于步骤2,您的方法是可行的,但我也建议使用dplyr中的select函数:

您还可以使用不带引号的名称对列进行索引,也可以使用-5或-column_name删除列,同时可以执行步骤3

df <- dplyr::select(
  df,
  GMT_Date = 2,
  GMT_Time = 3,
  LMT_Date = 4,
  LMT_Time = 5,
  Latitude = 9,
  Longitude = 10,
  PDOP = 12,
  `2D_3D` = 13
  )
现在,将这些放在一起—使用dplyr的管道语法%>%,使其看起来更漂亮:

process_a_file <- function(filename) {
  readr::read_delim(filename,
                    delim = " ",
                    col_names = FALSE,
                    na = "N/A") %>%
    dplyr::select(
      GMT_Date = 2,
      GMT_Time = 3,
      LMT_Date = 4,
      LMT_Time = 5,
      Latitude = 9,
      Longitude = 10,
      PDOP = 12,
      `2D_3D` = 13
    ) %>%
    dplyr::mutate(animal_id = stringr::str_extract(basename(tools::file_path_sans_ext(filename)), "THE REGEX GOES HERE"))
}
results_list <- lapply(files, process_a_file)
results_df <- dplyr::bind_rows(results_list)

@Buck2079很高兴听到这个消息:如果你能接受答案,我将不胜感激。。。虽然我不是为了代表而加入的!我是。
dplyr::select(df, 2:5,9,10,12,1)
df <- dplyr::select(
  df,
  GMT_Date = 2,
  GMT_Time = 3,
  LMT_Date = 4,
  LMT_Time = 5,
  Latitude = 9,
  Longitude = 10,
  PDOP = 12,
  `2D_3D` = 13
  )
dplyr::mutate(df, animal_id = stringr::str_extract(basename(tools::file_path_sans_ext(filename)), "THE REGEX GOES HERE"))
process_a_file <- function(filename) {
  readr::read_delim(filename,
                    delim = " ",
                    col_names = FALSE,
                    na = "N/A") %>%
    dplyr::select(
      GMT_Date = 2,
      GMT_Time = 3,
      LMT_Date = 4,
      LMT_Time = 5,
      Latitude = 9,
      Longitude = 10,
      PDOP = 12,
      `2D_3D` = 13
    ) %>%
    dplyr::mutate(animal_id = stringr::str_extract(basename(tools::file_path_sans_ext(filename)), "THE REGEX GOES HERE"))
}
results_list <- lapply(files, process_a_file)
results_df <- dplyr::bind_rows(results_list)