如何使用“ for循环”编写多个.csv文件名?

时间:2019-03-04 18:39:34

标签: r csv for-loop

有人知道执行“ 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)

2 个答案:

答案 0 :(得分:0)

尝试一下:

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中,但是最好将其保留为列表以末尾写入文件。

答案 1 :(得分:0)

请考虑通过创建以下函数来概括您的过程: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)