R

时间:2018-10-31 00:40:44

标签: r for-loop if-statement merge filelist

我正在努力为特定存储库中的所有txt.files创建一个for循环。 目标是将所有单独保存的txt.files合并到一个数据帧中,并添加一个ID变量,该变量始终可以在txt文件名中找到(例如,文件“ 10_1。ID = 10。记录01.10.2015 131514_CsvData”。 txt“)

txt_files <- list.files("Data/study", pattern = ".txt")  
  

txt_files    [1]“ 1_1。录像18.09.2015 091037_CsvData.txt”“ 10_1。录像2015年1月10日131514_CsvData.txt”
   [3]“ 100_1。记录02.10.2015 091630_CsvData.txt”“ 104_1。记录22.09.2015 142604_CsvData.txt”
   [5]“ 107_1。录像18.09.2015 104300_CsvData.txt”“ 110_1。录像29.09.2015 081558_CsvData.txt”
   [7]“ 112_1。记录21.09.2015 082908_CsvData.txt”“ 114_1。记录器29.09.2015 101159_CsvData.txt”
   [9]“ 115_1。记录23.09.2015 141204_CsvData.txt”“ 116_1。记录30.09.2015 110624_CsvData.txt”
  [11]“ 117_1。录制01.10.2015 141227_CsvData.txt”“ 120_1。录制17.2015.17 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))
}

1 个答案:

答案 0 :(得分:0)

避免在循环中使用USERS FIELDS ------------ ---------------------------- id | Name field_id | item_id | value ------------ ---------------------------- 448 | Karen 1 | 448 | 1234 489 | Steve 2 | 448 | bathurst 1 | 489 | 2234 2 | 489 | orange RESULTS USER 0 ==> id: 448 employee_id: 1234 location: bathurst 1 ==> id: 489 employee_id: 2234 location: orange ,这会导致过多的内存复制。考虑构建一个数据帧列表,并在任何循环之外使用rbind将它们绑定一次。对于此方法,do.call是一种比lapply有用的迭代替代方法,它可以构建这样的数据帧列表,因为您无需记账初始化空列表并迭代更新元素。

还考虑不使用分隔符的forpaste0删除下划线到字符串末尾的任何字符以提取ID。

gsub