R 根据文件名追加文件
我是R方面的新手,在同一个文件夹中有许多长名称的文本格式的气候数据文件,例如,“tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_R12Ip1P1_SMHI-RCA4_v3_day_20060101-20101231.txt”,其中每个用“_”分隔的术语对应于变量、域、机构、场景等特征。 我想要的是一个代码,允许我选择文件夹中与模型名、场景名、gcm名同名的所有文件,并按行追加它们 我尝试的是首先创建一个文件列表,并为其名称的每个部分分配变量,如model_name、gcm_name等。 然后创建了一个条件,在这个条件下,我用循环通过文件比较这些变量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_
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])