Я исхожу из фона теории вычислений Java/Python, поэтому я все еще привык к различным R-пакетам и как они могут экономить время выполнения в функциях.lapply с растущей функцией data.table в R
В принципе, я работаю над несколькими проектами, и все они связаны с использованием отдельных факторов в наборе данных с длинными списками (от 15 000 до 200 000 факторов) и выполнении вычислений по отдельным факторам в столь же большом наборе данных и одновременно сохраняя результаты этих вычислений в экспоненциально более длинном кадре данных.
До сих пор я использовал вложенные петли и конкатенацию в растущий список, но это занимает несколько дней. Ive недавно узнал о «lapply» и «data.frame» вариантов в R, и я хотел бы видеть пример того, как не применять (не каламбур) их к следующей основной функции корреляции:
Corr<-function(miRdf, mRNAdf)
{
j=1
k=1
m=1
n=1
c=0
corrList=NULL
while(n<=71521)
{
while(m<=1477)
{
corr=cor(as.numeric(miRdf[k,2:13]), as.numeric(mRNAdf[j,2:13]), use ="complete.obs")
corrList<-c(corrList, corr)
j=j+1
c=c+1
print(c) #just a counter to see how far the function has run
m=m+1
}
k=k+1
n=n+1
j=1
m=1 #to reset the inner while loop
}
corrList<-matrix(unlist(corrList), ncol=1477, byrow=FALSE)
colnames(corrList)<-miRdf[,1]
rownames(corrList)<-mRNAdf[,1]
write.csv(corrList, "testCorrWhole.csv")
}
Как вы можете видеть, вложенный цикл while дает результаты 105R36517 (71521x1477) miRNA vs mRNA, которые необходимо выполнить и хранить в кадре данных, который составляет 1477 cols x 71521 строк, чтобы генерировать матрицу скоринга.
Мой вопрос в том, может ли кто-нибудь пролить свет на то, как превратить вышеупомянутое чудовище в эффективную функцию, которая использует «lapply» вместо циклов while и использует функцию set.tat.table(), чтобы покончить с неэффективность объединения списка во время каждого прохода через петлю?
Спасибо заранее!
Не могли бы вы добавить некоторые образцы данных, пожалуйста? Это поможет людям легче работать над этим вопросом. –
Как бы я мог добавить сюда эти огромные наборы данных? Это всего лишь кадры данных с 8 столбцами каждый и 1477 и 71 521 строк соответственно. Каждая строка из одного df сравнивается с каждой строкой второй. Я просто пытаюсь выяснить, как «переписать» вышеуказанный код, используя «lapply» и «data.table». Любой, кто знаком с этими функциями, легко сможет понять, что делает мой оригинальный код. –
Предположим, вы googled, и вы уже прочитали статьи, которые могли бы помочь, например, http://www.jstatsoft.org/v40/i01/. Если у вас уже есть, то вы здесь для конкретных советов - вот где воспроизводимый набор кода пригодится, так как это облегчает людям работу и решение проблемы. Чем сложнее вы это сделаете, тем меньше вероятность получить ответ. Что касается того, как это сделать - вам не нужен полный data.frame, просто подмножество, использующее некоторые векторы rnorm(). http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –