我是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条件的文件,例如从这两个文件中制作一个文件:
tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_r12i1p1_SMHI-RCA4_v3_day_20060101-20101231.txt
tasmax_SAM-44_ICHEC-EC-EARTH_rcp26_r12i1p1_SMHI-RCA4_v3_day_20110101-20151231.txt
非常欢迎任何帮助和建议!
答案 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)
不确定我是否能完全回答您的问题,但这可能会有所帮助:
代码工作如下
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])
(不是实际的语法,仅是一个主意,还请确保然后确保循环范围正确)