Как использовать "для цикла", чтобы написать несколько имен файлов .csv? - PullRequest
0 голосов
/ 04 марта 2019

Кто-нибудь знает лучший способ выполнить цикл «for», который будет читать различные идентификаторы субъекта и добавлять их к имени экспортируемого csv?

Например, у меня есть несколько выходных файловиз программного обеспечения электрокардиограммы (каждый файл принадлежит одному человеку).Файлы называются C800_HR.bdf.evt, C801_HR.bdf.evt, C802_HR.bdf.evt и т. Д. Каждый файл считывается в r, а затем применяется скрипт для расчета вариабельности сердечного ритма.В конце скрипта мне нужно добавить цикл, который будет извлекать идентификатор субъекта (например, C800, C801, C802) и записывать новое имя файла для каждого человека, чтобы он стал C800_RtoR.csv.По сути, я хотел бы избежать изменения синтаксиса каждый раз, когда я читаю и экспортирую имя файла.

В настоящее время я использую следующий синтаксис для чтения в нескольких файлах:

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

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Рассмотрите возможность обобщения вашего процесса, создав функцию, которая: 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)
0 голосов
/ 04 марта 2019

Попробуйте это:

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, но было бы лучше оставить его в виде списка для записи файлов в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...