Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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/8/file/3.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 根据文件名追加文件_R_File_Append - Fatal编程技术网

R 根据文件名追加文件

R 根据文件名追加文件,r,file,append,R,File,Append,我是R方面的新手,在同一个文件夹中有许多长名称的文本格式的气候数据文件,例如,“tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_R12Ip1P1_SMHI-RCA4_v3_day_20060101-20101231.txt”,其中每个用“_”分隔的术语对应于变量、域、机构、场景等特征。 我想要的是一个代码,允许我选择文件夹中与模型名、场景名、gcm名同名的所有文件,并按行追加它们 我尝试的是首先创建一个文件列表,并为其名称的每个部分分配变量,如model_name、gcm_

我是R方面的新手,在同一个文件夹中有许多长名称的文本格式的气候数据文件,例如,“tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_R12Ip1P1_SMHI-RCA4_v3_day_20060101-20101231.txt”,其中每个用“_”分隔的术语对应于变量、域、机构、场景等特征。 我想要的是一个代码,允许我选择文件夹中与模型名、场景名、gcm名同名的所有文件,并按行追加它们

我尝试的是首先创建一个文件列表,并为其名称的每个部分分配变量,如model_name、gcm_name等。 然后创建了一个条件,在这个条件下,我用循环通过文件比较这些变量

file <- list.files ( pattern = '*.txt' ) 

group <- function(input){

index = which(file == input)

df=read.table(input,header=FALSE,sep="")

fname= unlist((strsplit(input,"_")),use.names=FALSE)

model_name=fname[3]

sce_name=fname[4]

gcm_name=fname[6]

m=1

for (m in 1:length(file)) {

  if (model_name[m]==model_name[m+1] & sce_name[m]==sce_name[m+1] & gcm_name[m]==gcm_name[m+1]) {

    data=rbind(df[m],df[m+1])

  } else  {}

}
  }

for (i in 1:length(file)) {
  group(file[i])
}

file我建议一种完全不同的方法:

获取所有txt文件的列表:

file <- list.files ( pattern = '*.txt' )

不确定我是否完全理解您的问题,但这可能会有所帮助:

代码的工作原理如下

  • 读取作为输入提供的文件的值
  • 循环所有其他文件,如果它们符合您的条件,则追加它们
  • If
    条件检查输入的值,然后将其与文件[m]的名称进行比较。如果为true,则会将其附加到数据中。另一个解决方法:在函数结束时必须使用
    return(data)


    文件您的if条件出现错误。[m+1]的值不存在。这里有一个问题:您是否只想将这些文件与第一个读取文件名的文件合并?谢谢您的帮助,但我看不到其他方法来循环索引,有什么建议吗?是的,我想选择所有具有相同名称的文件,从2006年到2100年。我提交了两个文件名,以显示我想如何分组。谢谢您的帮助,但我无法将X3、X4和X6与您建议的代码连接起来,您能解释一下吗?因为在每个文本文件中,我只有日期和变量。因此,如果我将所有系列放在一起,我无法区分不同的模型名称和场景。谢谢
    
    library(dplyr)
    library(readr)
    df <- suppressMessages(do.call(bind_rows,lapply(file, read_csv, col_names = FALSE)))
    
    df %>%
        group_by(X3, X4, X6) %>%
        do(write_csv(., paste(.$X3, .$X4, .$X6, ".csv", sep = "_")))
    
    group <- function(input){
    
      index = which(file == input)
    
      data=read.table(input,header=FALSE,sep="")
    
      fname= unlist((strsplit(input,"_")),use.names=FALSE)
    
      model_name=fname[3]
    
      sce_name=fname[4]
    
      gcm_name=fname[6]
    
      for (m in 2:length(file)) {
    
        index = file[m]
    
        df_new=read.table(file[m],header=FALSE,sep="")
    
        fname= unlist((strsplit(input,"_")),use.names=FALSE)
    
        if (model_name==fname[3] & sce_name==fname[4] & gcm_name==fname[6]) {
    
          data=rbind(data,df_new)
    
        } else  {}
    
      }
      return(data)
    }
    
    group(file[1])