Создание функции в R для подмножества и запуска анализа AUDPC - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь выполнить анализ AUDPC на некоторых данных. Данные должны быть разбиты на обработки и дублировать блоки для анализа. Ниже я попытался написать функцию с целью разделения анализа данных и получения результатов всех блоков обработки в одной таблице / объекте

library("agricolae")
library("plyr")
library("dplyr")
data = read.csv("Bio2018.csv", header = TRUE, sep = ",")
data$Treatment = as.character(data$Treatment)
data$Block = as.character(data$Block)
data$Time = as.numeric(data$Time)
AUDPC.rel = function(Treatment, Block){
  data.Treatment <- subset(data, data$Treatment == Treatment & data$Block == Block)
  AUDPC = data.frame(audpc(data.Treatment$Foci, data.Treatment$Time, type = "absolute"))
}
variables = expand.grid(Treatment = c(unique(data$Treatment)), Block = c(unique(data$Block)))
Relative.AUDPC = mdply(variables,AUDPC.rel)
Relative.AUDPC

Выходные данные всегда дают один и тот же номер для всех блоков обработки. Как показано:

Лечение - Блок - оценка
Без обработки - Rep.1 - 200;
Изумруд - Реп.1 - 200;
Нортика - Реп.1 - 200;
Без обработки - Rep.2 - 200;
Изумруд - Реп.2 - 200;
Нортика - Реп.2 - 200;
Без обработки - Rep.3 - 200;
Изумруд - Реп.3 - 200;
Нортика - Реп.3 - 200;

1 Ответ

0 голосов
/ 05 сентября 2018

Рассмотрим базовые R by для подстановки фрейма данных одним или несколькими факторами, такими как Обработка и Блок . А поскольку by вернет список фреймов данных (вывод функции), запустите do.call, чтобы связать строки всех элементов df с одним конечным фреймом данных.

Кроме того, поскольку by работает по нескольким факторам для разделения на все возможные комбинации, оберните tryCatch для таких особых подмножеств нулевых строк, которые могут вызвать ошибку вызова audpc.

# BUILD FUNCTION TO RECEIVE SUBSET DF
AUDPC.rel <- function(sub) {    
  tryCatch(data.frame(Treatment = sub$Treatment[[1]],
                      Block = sub$Block[[1]],
                      Evaluation = audpc(sub$Foci, sub$Time, type = "absolute")),
           error = function(e)
                     data.frame(Treatment = sub$Treatment[[1]],
                                Block = sub$Block[[1]],
                                Evaluation = NA)
           )
}

# CALL BY(), PASSING SUBSETS TO DEFINED FUNCTION
df_list <- by(data, data[c("Treatment", "Block")], AUDPC.rel)

# BUILD SINGLE FINAL DF
final_df <- do.call(rbind, df_list)
...