根据文件名附加文件

时间:2019-05-18 18:56:37

标签: r file append

我是R的新手,并且在同一文件夹中有很多带有长名称的文本格式的气候数据文件,例如,“ tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_r12i1p1_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])
}

我的代码存在以下错误:

  

if(model_name [m] == model_name [m + 1]&sce_name [m] ==   sce_name [m +:需要TRUE / FALSE的缺失值

最后,代码应追加满足if条件的文件,例如从这两个文件中制作一个文件:

  1. tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_r12i1p1_SMHI-RCA4_v3_day_20060101-20101231.txt

  2. tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_r12i1p1_SMHI-RCA4_v3_day_20110101-20151231.txt

非常欢迎任何帮助和建议!

2 个答案:

答案 0 :(得分:1)

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

获取所有txt文件的列表:

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

将所有文件读取到单个数据框中:

library(dplyr)
library(readr)
df <- suppressMessages(do.call(bind_rows,lapply(file, read_csv, col_names = FALSE)))

然后group_by插入所需的字段并将每个帧写入单独的csv文件

df %>%
    group_by(X3, X4, X6) %>%
    do(write_csv(., paste(.$X3, .$X4, .$X6, ".csv", sep = "_")))

答案 1 :(得分:0)

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

代码工作如下

  1. 读取输入的文件值。
  2. 遍历所有其他文件,并在符合您条件的情况下附加它们。

DecisionTreeClassifier条件检查输入的值,然后将其与文件名[m]进行比较。如果为true,它将被附加到您的数据中。另一个解决方案:您必须在函数末尾使用If

return(data)

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

仍需解决的问题:如果不输入第一个文件,则必须解决。由于此代码使用您在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]) 函数中输入的文件。但是for循环与第二个文件一起使用。因此,如果您使用group,则第一个文件将被跳过,而第三个文件将被加倍。您可以使用其他类似的条件。 group(file[3])(不是实际的语法,仅是一个主意,还请确保然后确保循环范围正确)