вывод результатов из вложенного цикла в R - PullRequest
0 голосов
/ 09 сентября 2018

В прилагаемом фрейме данных у меня 10 предметов (5 мужчин и 5 женщин).У каждого субъекта есть три аналита (A, B, C), и у каждого аналита есть три значения посещения (посещение = 1,2,3).Теперь я хочу провести сравнение двух групп: мужчины и женщины по каждому аналиту и каждому посещению.Я использовал вложенный цикл с i в аналите и j в посещении.Желаемый формат вывода прилагается (9 строк и 7 столбцов).Я рассчитываю на девять рядов, но здесь только три.Я думаю, что вывод для цикла i не был сохранен правильно, но я не уверен, как правильно включить i.Какие-либо предложения?Большое спасибо!

df1 = data.frame(id = c(1:10), gender = c(rep(c("F","M"),5)))
df2 = data.frame(id = c(1:10), analyte = c(rep(c("A","B","C"), 10)))
df3 = data.frame(id = rep((1:10),each=3), visit = rep(c("day1","day2","day3"),10))

set.seed(123)
df4 = data.frame(id = rep((1:10),each=9), val=rnorm(n = 90, mean = 0, sd = 1))
df5  = Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "id", all.x = TRUE), list(df1,df2,df3))
df  = cbind(df5,df4)[,-5]

mk1=unique(df$analyte)
mk2=unique(df$visit)

out=matrix(NA, ncol=7, nrow=9)

for(i in 1:length(mk1)){
  for (j in 1:length(mk2)){
    dd = df[as.character(df$analyte)==mk1[i]&as.character(df$visit)==mk2[j],]
    x = as.vector(dd$val[dd$gender=="F"])
    y = as.vector(dd$val[dd$gender=="M"])
    med1=as.numeric(quantile(x, probs=seq(0,1, by=0.25), na.rm=TRUE, type=2)[3])
    med2=as.numeric(quantile(y, probs=seq(0,1, by=0.25), na.rm=TRUE, type=2)[3])
    ci=wilcox.test(x, y, conf.int = TRUE, exact=FALSE)$conf.int
    out[j,] = c(mk1[i], mk2[j],length(x),length(y),
                med1, med2, wilcox.test(x, y, conf.int = TRUE, 
                                        exact=FALSE)$p.value)
  }
}

colnames(out)=c("Analyte", "VISIT", "Female (N)", "Male (N)",
                "Median of Female", "Median of Male", "P_wilxon")

analytes table

enter image description here

1 Ответ

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

Ваша непосредственная проблема заключается в том, что вы переназначаете одну и ту же строку выходной матрицы. Ниже будут сохранены только последние три строки, так как j никогда не достигнет 9.

out[j,] <- ...

Однако вместо вложенных циклов for для итеративного назначения выходных данных заранее определенной матрице с жестко заданными размерами используйте более динамичный подход. Рассмотрим by для поднабора фрейма данных с помощью , посещения и analyte , а затем передачи поднаборов в необходимую операцию. В конце список привязки строк списка фреймов данных для конечного объекта:

run_comparison <- function(dd) {
    x <- as.vector(dd$val[dd$gender=="F"])
    y <- as.vector(dd$val[dd$gender=="M"])

    med1 <- as.numeric(quantile(x, probs=seq(0,1, by=0.25), na.rm=TRUE, type=2)[3])
    med2 <- as.numeric(quantile(y, probs=seq(0,1, by=0.25), na.rm=TRUE, type=2)[3])

    wx <- wilcox.test(x, y, conf.int = TRUE, exact=FALSE)

    data.frame(ANALYTE = dd$analyte[[1]], Visit = dd$visit[[1]], 
               Female_N = length(x), Male_N = length(y),
               Female_Median = med1, Male_Median= med2, 
               P_Wilcox = wx$p.value)        
}

df_list <- by(df, df[c("analyte", "visit")], run_comparison)

final_df <- do.call(rbind, df_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...