在 txt.files 的列表上使用 R 中的 if 条件进行循环
For-loop over list of txt.files with if conditions in R
我正在努力为特定存储库中的所有 txt.files 创建一个 for 循环。
目标是将所有单独保存的 txt.files 合并到一个数据框中,并添加一个始终可以在 txt 文件名中找到的 ID 变量(例如,文件“10_1 的 ID=10”。录制 01.10.2015 131514_CsvData.txt" )
txt_files <- list.files("Data/study", pattern = ".txt")
txt_files
[1] "1_1. Recording 18.09.2015 091037_CsvData.txt" "10_1. Recording 01.10.2015 131514_CsvData.txt"
[3] "100_1. Recording 02.10.2015 091630_CsvData.txt" "104_1. Recording 22.09.2015 142604_CsvData.txt"
[5] "107_1. Recording 18.09.2015 104300_CsvData.txt" "110_1. Recording 29.09.2015 081558_CsvData.txt"
[7] "112_1. Recording 21.09.2015 082908_CsvData.txt" "114_1. Recording 29.09.2015 101159_CsvData.txt"
[9] "115_1. Recording 23.09.2015 141204_CsvData.txt" "116_1. Recording 30.09.2015 110624_CsvData.txt"
[11] "117_1. Recording 01.10.2015 141227_CsvData.txt" "120_1. Recording 17.09.2015 153516_CsvData.txt"
读入合并txt.files
for ( file in txt_files){
# if the merged dataframe "final_df" doesn't already exist, create it
if (!exists("final_df")){
final_df<- read.table(paste("Data/study/",file, sep=""), header=TRUE, fill=TRUE)
temp_ID <- substring(file, 0,str_locate_all(pattern ='_1.',file)[[1]][1]-1)
final_df$ID <- temp_ID
final_df <- as.data.frame(final_df)
}
# if the merged dataframe does already exist, append to it
else {
temp_dataset <- read.table(paste("Data/study/",file, sep=""), header=TRUE, fill=TRUE)
# extract ID column from filename
temp_ID <- substring(file, 0,str_locate_all(pattern ='_1.',file)[[1]][1]-1)
temp_dataset$ID <- temp_ID
final_df<-rbind(final_df, temp_dataset)
}
return(as.data.frame(final_df))
}
避免在循环中使用 rbind
,这会导致在内存中进行过多的复制。考虑构建一个数据帧列表,并在任何循环之外用 do.call
将它们绑定在一起。对于这种方法,lapply
是一种比 for
有用的迭代替代方法来构建这样的数据框列表,因为您可以避免初始化空列表和迭代更新元素的簿记。
还考虑 paste0
没有分隔符参数和 gsub
删除从下划线到字符串末尾的任何字符以提取 ID。
setwd("Data/study")
txt_files <- list.files(pattern = ".txt")
df_list <- lapply(txt_files, function(file)
transform(read.table(file, header=TRUE, fill=TRUE),
temp_ID = gsub("_.*", "", file))
)
final_df <- do.call(rbind, df_list)
我正在努力为特定存储库中的所有 txt.files 创建一个 for 循环。 目标是将所有单独保存的 txt.files 合并到一个数据框中,并添加一个始终可以在 txt 文件名中找到的 ID 变量(例如,文件“10_1 的 ID=10”。录制 01.10.2015 131514_CsvData.txt" )
txt_files <- list.files("Data/study", pattern = ".txt")
txt_files [1] "1_1. Recording 18.09.2015 091037_CsvData.txt" "10_1. Recording 01.10.2015 131514_CsvData.txt"
[3] "100_1. Recording 02.10.2015 091630_CsvData.txt" "104_1. Recording 22.09.2015 142604_CsvData.txt"
[5] "107_1. Recording 18.09.2015 104300_CsvData.txt" "110_1. Recording 29.09.2015 081558_CsvData.txt"
[7] "112_1. Recording 21.09.2015 082908_CsvData.txt" "114_1. Recording 29.09.2015 101159_CsvData.txt"
[9] "115_1. Recording 23.09.2015 141204_CsvData.txt" "116_1. Recording 30.09.2015 110624_CsvData.txt"
[11] "117_1. Recording 01.10.2015 141227_CsvData.txt" "120_1. Recording 17.09.2015 153516_CsvData.txt"
读入合并txt.files
for ( file in txt_files){
# if the merged dataframe "final_df" doesn't already exist, create it
if (!exists("final_df")){
final_df<- read.table(paste("Data/study/",file, sep=""), header=TRUE, fill=TRUE)
temp_ID <- substring(file, 0,str_locate_all(pattern ='_1.',file)[[1]][1]-1)
final_df$ID <- temp_ID
final_df <- as.data.frame(final_df)
}
# if the merged dataframe does already exist, append to it
else {
temp_dataset <- read.table(paste("Data/study/",file, sep=""), header=TRUE, fill=TRUE)
# extract ID column from filename
temp_ID <- substring(file, 0,str_locate_all(pattern ='_1.',file)[[1]][1]-1)
temp_dataset$ID <- temp_ID
final_df<-rbind(final_df, temp_dataset)
}
return(as.data.frame(final_df))
}
避免在循环中使用 rbind
,这会导致在内存中进行过多的复制。考虑构建一个数据帧列表,并在任何循环之外用 do.call
将它们绑定在一起。对于这种方法,lapply
是一种比 for
有用的迭代替代方法来构建这样的数据框列表,因为您可以避免初始化空列表和迭代更新元素的簿记。
还考虑 paste0
没有分隔符参数和 gsub
删除从下划线到字符串末尾的任何字符以提取 ID。
setwd("Data/study")
txt_files <- list.files(pattern = ".txt")
df_list <- lapply(txt_files, function(file)
transform(read.table(file, header=TRUE, fill=TRUE),
temp_ID = gsub("_.*", "", file))
)
final_df <- do.call(rbind, df_list)