Улучшение простой вложенности для эффективности цикла в R
Я бегу перестановки, чтобы получить р-значение. У меня есть два кадра данных, df1
а также df2
; Вот как они выглядят:
df1 <- data.frame(X1 = c("Gene1","Gene2","Gene3", "Gene4", "Gene5","Gene6"), Type1 = runif(5), Type2 = runif(6), Type3 = runif(6), SizeQuintile = c(1,2,1,5,5,1),
ExpressionQuintile = c(1,1,1,5,5,1))
df2 <- data.frame(X1 = c("Gene1","Gene2","Gene3"), Type1 = runif(3), Type2 = runif(3), Type3 = runif(3), SizeQuintile = c(1,2,1),
ExpressionQuintile = c(1,1,1))
У меня есть вложенный цикл for, который проходит через каждую комбинацию обоих квинтилей (например, SizeQuintile 1, ExpressionQuintile 1; затем SizeQuintile 1, ExpressionQuintile 2 и т. Д.) И извлекает значение в одном из трех Type
колонны.
Например, я хотел бы извлечь три Type
значения, которые соответствуют SizeQuintile1 и Expression Quintile1 в df1, и сравните эти значения с двумя Type
значения в df2.
Затем я добавляю эти значения к двум отдельным векторам, vector1
а также vector2
прежде чем сравнивать их медианы. Поскольку я запускаю перестановку, я хочу сделать это 10000 раз.
permutation_number = 10000
for(j in 1:permutation_number){
vector1 <- c()
vector2 <- c()
for(i in 1:5){
for(z in 1:5){
#Print number of genes to sample
number_of_rows <- length(which(df1$SizeQuintile == i & df1$ExpressionQuintile == z))
#Extract value from every combination of quintiles, append to vector
vector1 <- append(vector1, df1[which(df1$SizeQuintile == i & df1$ExpressionQuintile == z), ]$Type1)
vector2 <- append(vector2, df2[sample(which(df$SizeQuintile == i & df2$ExpressionQuintile == z), number_of_rows), ]$Type1)
}
}
#Compare medians, then append resulting TRUE or FALSE value to a #vector.
vector3 <- append(vector3, median(vector1) > median(vector2))
}
#Compute p value
vector3/permutation_number
Код работает, но он очень медленный. Есть ли способ сделать это более эффективно в R?