2016-01-19 4 views
-1

У меня есть набор действительных значений (> 50k), и для каждого из них я хочу видеть, какая доля перестановленных для этого сайта больше, чем наблюдаемое значение. Я решил эту проблему, используя следующий for-loop, но, похоже, работает медленно, и мне было интересно, есть ли у кого-нибудь предложения по его оптимизации или более эффективному методу.Как сделать эту петлю R более эффективной?

Заранее благодарен!

В этом коде действительный [, 3] соответствует вектору действительных значений, матрица - результат вывода, а perm [, 3] содержит все перестановленные значения.

for (i in 1:nrow(real)) { 
    real[i,3] -> output[i,1] 
    subset(perm, perm[,1] == row.names(real[i,])) -> sims 
    nrow(sims[sims[,3] > significance[i,1],]) -> output[i,3] 
    nrow(sims) -> output[i,2] 
} 

Руководитель реального файла: только третий столбец имеет важное значения для этого

chr10_1012663 134.1894 130.9915 -3.197876e+00 -2.411963e-02  0 
chr10_1012716 144.3250 130.9433 -1.338170e+01 -9.730331e-02  0 
chr10_10160551 155.6744 138.7002 -1.697420e+01 -1.154519e-01  0 
chr10_10163175 304.4715 261.5272 -4.294435e+01 -1.520394e-01  0 
chr10_1018272 133.0447 133.0447 -8.930860e-08 -6.712676e-10  0 

руководителя файла завивки: только третий столбец имеет важное значение, а также. Этот файл содержит 50 перестановок на каждый сайт в реальном файле.

chr10_1012663 99.94432 130.9915 3.104717e+01 2.705191e-01 1 
chr10_1012716 130.94332 130.9433 -3.600817e-08 -2.749906e-10 0 
chr10_10160551 138.63097 138.7002 6.921823e-02 4.991739e-04 1 
chr10_10163175 261.52720 261.5272 4.579061e-08 1.750893e-10 1 

Глава выходного файла: столбцы (я) реальное значение, (б) количество permuations набрал, и (III) число перестановок больше, чем реальное значение.

-3.197876e+00 50 39 
-9.730331e-02 50 44 
-1.154519e-01 50 48 
-1.520394e-01 50 49 
-6.712676e-10 50 38 
+1

Можете ли вы опубликовать минимально полезные/воспроизводимые данные проб и ожидаемый результат? Затем мы можем помочь вам с рабочим кодом. – Gopala

+1

вы можете дать нам (небольшой) [воспроизводимый пример] (http://tinyurl.com/reproducible-000), пожалуйста? –

+0

Можете ли вы предоставить вывод 'dput (head (real))', 'dput (head (perm))' и 'dput (head (matrix))'? Кроме того, обычно не рекомендуется указывать объекты после функций. Матрица является функцией в R, поэтому вы должны называть этот объект чем-то еще –

ответ

0

Редактировать: Основное сообщение изменено, поэтому я отредактировал некоторые материалы для соответствия.

Если вы зацикливание на все строки real, то вы можете также назначить вектор real[,3] для output[,1] на одном дыхании:

output[,1] <- real[,3] 

Поскольку у вас всегда есть 50 перестановок, вы можете просто присвоить 50 до output[,2]:

output[,2] <- 50 

Далее вы пытаетесь найти имя строки в real, который соответствует значению первого столбца в perm и хранить корр отходящий ряд от perm в sims. Я бы рекомендовал не хранить информацию в именах строк, но даже если вы это сделаете, есть лучший способ сделать это (см. Ниже). Поскольку вы тогда используете только sims[,3], вы можете также подмножить 3-й столбец от perm.

sims <- sapply(row.names(real), function(x) perm[perm[,1] == x, 3]) 
for (i in 1:nrow(real)) output[i,3] <- length(sims[[i]][sims[[i]] > significance[i,1]]) 
+0

Большое спасибо! Второй шаг по-прежнему занимает некоторое время, но он намного быстрее, чем раньше! – Jautis

+0

Какой именно шаг? Я посмотрю, смогу ли я что-нибудь придумать быстрее. Редактировать: неважно, я не могу рассчитывать. Во всяком случае, я думаю, что это можно сделать быстрее ... Всегда есть 50 перестановок для каждого места? – Laterow

+0

Да, всегда будет одинаковое количество перестановок для каждого сайта – Jautis

Смежные вопросы