【问题标题】:how to use "for loop" to write multiple .csv file names?如何使用“for 循环”写入多个 .csv 文件名?
【发布时间】:2023-03-25 23:00:02
【问题描述】:

有谁知道执行“for 循环”的最佳方式,该循环会读取不同的主题 ID 并将它们附加到导出的 csv 的名称中?

例如,我有一个心电图软件​​程序的多个输出文件(每个文件属于一个人)。这些文件被命名为 C800_HR.bdf.evt、C801_HR.bdf.evt、C802_HR.bdf.evt 等。每个文件都被读入 r,然后应用一个脚本来计算心率变异性。在脚本的最后,我需要添加一个循环来提取主题 ID(例如 C800、C801、C802)并为每个人编写一个新文件名,使其变为 C800_RtoR.csv。本质上,我想避免每次读入和导出文件名时都更改语法。

我目前正在使用以下语法读取多个文件:

>setwd("/Users/kmpc/Downloads")
>myhrvdata <-lapply(Sys.glob("C8**_HR.bdf.evt"), read.delim)

【问题讨论】:

  • 尝试paste0(substr(1, 4, x), "_RtoR.csv"),其中x 包含您的文件名。

标签: r csv for-loop


【解决方案1】:

试试这个:

cardio_files <- list.files(pattern = "C8\\d{2}_HR.bdf.evt")
subject_ids <- sub("^(C8\\d{2})_.*", "\\1" cardio_files)

myList <- lapply(cardio_files, read.delim)


## do calculations on the list

for (i in names(myList)) {

  write.csv(myList[[i]], paste0(subject_ids[i], "_RtoR.csv"))

}

唯一的问题是,您必须在进行计算时使用列表。您可以将它们组合成一个 data.frame,但最好将其保留为列表以在最后写入文件。

【讨论】:

    【解决方案2】:

    考虑通过创建一个函数来概括您的流程:1) 读取文件,2) 处理数据,3) 输出到 csv。然后让lapply 在所有Sys.glob 项目上迭代调用定义的方法,甚至返回计算数据帧的列表。

    proc_heart_rate <- function(f_name) {
       # READ IN .evt FILE INTO df
       df <- read.delim(f_name)
    
       # CALCULATE HEART RATE VARIABILITY WITH df
       ...
    
       # OUTPUT df TO CSV
       subject_id <- gsub("\\_.*", "", f_name)
       write.csv(df, paste0(subject_id, "_RtoR.csv"))
    
       # RETURN df FOR OTHER USES
       return(df)
    }
    
    # LIST OF DATA FRAMES WITH CALCULATIONS
    myhrvdata_list <-lapply(Sys.glob("C8**_HR.bdf.evt"), proc_heart_rate)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2018-01-19
      • 2021-05-13
      • 2020-08-08
      • 2018-03-14
      相关资源
      最近更新 更多