有没有人知道执行"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)
发布于 2019-03-05 03:04:23
试试这个:
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中,但最好将其保留为一个列表,以便在最后写入这些文件。
发布于 2019-03-05 03:59:13
考虑通过创建一个函数来泛化您的过程: 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)
https://stackoverflow.com/questions/54989529
复制相似问题