R: Самый быстрый способ создания фрейма данных с альтернативой IFELSE
У меня есть похожий вопрос на этот вопрос:Используя R, замените все значения в матрице <0.1 на 0?
Но в моем случае у меня есть гипотетически больший набор данных и переменные пороги. Мне нужно создать фрейм данных с каждым значением, полученным из условия, используя значения в первых столбцах того же фрейма данных. Эти значения различны для каждой строки.
Вот пример кадра данных:
SNP A1 A2 MAF
rs3094315 G A 0.172
rs7419119 G T 0.240
rs13302957 G A 0.081
rs6696609 T C 0.393
Вот пример моего кода:
seqIndividuals = seq(1:201)
for(i in seqIndividuals) {
alFrequ[paste("IND",i,"a",sep="")] = ifelse(runif(length(alFrequ$SNP),0.00,1.00) < alFrequ$MAF, alFrequ$A1, alFrequ$A2)
alFrequ[paste("IND",i,"b",sep="")] = ifelse(runif(length(alFrequ$SNP),0.00,1.00) < alFrequ$MAF, alFrequ$A1, alFrequ$A2)
}
Я создаю два новых столбца для каждого отдельного «i» в «seqIndividuals», получая либо значения из столбца «A1», если случайное значение меньше столбца «MAF», либо «A2», если оно выше. Код работает отлично, но по мере роста набора данных в строках и столбцах (отдельных лицах) время также значительно возрастает.
Есть ли способ избежать использования IFELSE для этой ситуации, как я понимаю, это работает как цикл? Я попытался сгенерировать матрицу случайных значений, а затем заменить их, но это занимает то же время или даже больше.
mtxAlFrequ = matrix(runif(length(alFrequ$SNP)*(201)),nrow=length(alFrequ$SNP),ncol=201)
mtxAlFrequ[mtxAlFrequ < alFrequ$MAF] = alFrequ$A1
Спасибо!