Как я могу запустить свой код через разные файлы Excel и экспортировать уникальные файлы результатов в R?

У меня есть шесть файлов Excel, все с одинаковым форматом и одинаковым количеством переменных (но с разными наблюдениями). У меня есть фрагмент кода, который мне нужно выполнить для всех и экспортировать результаты (значения p из статистического теста), но мне интересно, как я могу запустить код для всех шести файлов и экспортировать шесть уникальных файлов.

Код отлично работает, но мне приходится загружать каждый файл отдельно и каждый раз экспортировать его под разными именами.

data <- MorePercent & MoreCount & LessPercent & LessCount


#Data
    Type   Neutrophils  Monocytes   NKC .....
    ------------------------------------------
    IN       546          2663      545
    IN       0797         7979      008
    OUT      0899         3899      345
    OUT      6868         44533     689
    HC       9898         43443     563


#Kruskal and export 
PV <- as.data.frame(apply(data[-1], 2, 
              function(x) kruskal.test(x = x, g = data$Type)$p.value))

#rename col
colnames(PV) <- "PVal"
#export
write.xlsx(PV, "C:/Users/sxa074/Desktop/P01/Science Trans Med Follow Up/test2.xlsx")


#Post Hoc and export
PV1 <- as.data.frame(apply(data[-1], 2, 
           function(x) pairwise.wilcox.test(x = x, g = data$Type, p.adjust.method = "BH")$p.value))

#Omit NA row
PV1 <- na.omit(PV1)

#Rename Rows
row.names(PV1) <- c("HC vs In", "HC vs OUT", "IN vs OUT")
#Export
write.xlsx(PV1, "C:/Users/sxa074/Desktop/P01/Science Trans Med Follow Up/test2A.xlsx")

В настоящее время я экспортирую два файла Excel для каждого исходного файла (значения Kruskal P и значения Wilcox P), но мне приходится каждый раз заходить вручную и корректировать имена. Я хочу, чтобы код запускал их все и экспортировал уникальные файлы.

Спасибо заранее.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь уместна петля for. Это решение предполагает, что ваши данные находятся в одном каталоге, а результаты должны быть помещены в другой. Однако они могут находиться в одном каталоге. В этом решении p-значения из теста Крускала-Уоллиса а также p-значения из попарного теста Уилкоксона объединяются в одну таблицу, которая будет сохранена в виде файла Excel.

Если вы заинтересованы в консолидации результатов, вы можете использовать опцию sheetName в write.xlsx(), чтобы создать один файл Excel с несколькими листами.

В этом примере вам (конечно) нужно заменить заполнитель «<...>» соответствующими параметрами для вашей ситуации.

# Define directories of data and results
  dataPath <- <directory with flow data>
  resultsPath <- <directory for results>

# Vector of file names; a pattern for old and new Excel files is "xlsx?$"
  ff <- list.files(path = dataPath, pattern = "<pattern>", full = TRUE)

# Good old fashioned for loop
  for (f in ff) {
    data <- read.xslx(f, <other parameters>) # edit as required
    pv1 <- apply(data[-1], 2, function(x) kruskal.test(x, data$Type)$p.value)
    pv1 <- t(pv1) # transpose 3 x 1 result to 1 x 3
    pv2 <- apply(data[-1], 2, function(x) pairwise.wilcox.test(x, data$Type,
      p.adjust.method = "BH")$p.value)
    pv2 <- na.omit(pv2)
    ans <- rbind(pv1, pv2)
    rownames(ans) <- c("Pval", "HC vs In", "HC vs OUT", "IN vs OUT")
    fout <- file.path(resultsPath, paste("RESULTS", basename(f), sep = "_"))
    write.xlsx(ans, fout, rowNames = TRUE)
  }

РЕДАКТИРОВАТЬ

Относительно переменных-заполнителей «<...>»:

Для каталогов это просто расположение файлов. Например, если для каждого эксперимента используется один каталог, то и данные, и результаты могут храниться в одном и том же каталоге. На компьютере с Windows это может быть что-то вроде "C:\Users\Owner\Documents\Flow Analysis\2019_0512". И dataPath, и resultsPath будут установлены на это значение. Кстати, вы можете использовать следующий код для извлечения каталога данных, содержащего выбранный вами файл. Функция file.choose() позволяет выбрать файл через обычный диалог операционной системы.

  dataPath <- dirname(file.choose())

Для функции list.files() см. справочную функцию для list.files (или dir). Параметр pattern указывает регулярное выражение, которое можно использовать для выбора только файлов данных. Например, если шесть файлов данных выглядели как «FlowFile001.xlsx», «FlowFile002.xlsx», ..., «FlowFile006.xlsx», то шаблон регулярное выражение, указывающий, что эти файлы могут быть «Flow.*xlsx$». (Посмотрите regex, чтобы узнать о мире регулярных выражений, если это незнакомо.)

Параметры для read.xslx() зависят от структуры ваших данных в файле Excel. Например, это может включать пропуск пустых строк с помощью skipEmptyRows = TRUE.

Дэвид, это невероятно полезно, спасибо! Иметь значения P для обоих тестов в одной таблице на самом деле еще проще. Что касается "<...>", не могли бы вы уточнить, что вы подразумеваете под параметрами? Будет ли это местоположение моих файлов? Прошу прощения, я не очень хорошо разбираюсь в циклах вообще!

A Bedoya 15.05.2019 19:36

Рад узнать, что это помогло. Определенно стоит изучить базовые циклы и семейство функций apply, если вы хотите автоматизировать анализ с помощью R (или любого языка/среды программирования). Я добавил редактирование, чтобы уточнить природу заполнитель «<...>».

David O 16.05.2019 04:39

Другие вопросы по теме