2015-09-11 1 views
0

Я попытался написать нижеприведенный код, чтобы идентифицировать числа в пределах диапазона, то есть: SNP [i, 1] должен быть меньше Рабочего [j, 1] и больше, чем Working [j, 2 ] для добавления в новый фрейм данных.Ошибка с анализируемыми данными в R

Файл SNP - 350 строк, а рабочий - 6500. По какой-то причине я получаю 10000 строк с данными, которые не соответствуют моим условным.

Очевидно ли, что у меня здесь что-то не так?

for (i in 1:nrow(SNP_file)){ 
    for (j in 1:nrow(Working)){ 

if ((as.numeric(SNP_file[i,1]) >= as.numeric(Working[j,1])) && (as.numeric(SNP_file[i,1]) <= as.numeric(Working[j,2]))){ 
    New <- rbind(New, data.frame(Chromosome =Working[j, 1], 
            Start= Working[j, 2], 
            Stop = Working[j, 3], 
            GO = Working[j,4], 
            Position = VCF[i,1], 
            REF = SNP_file[i,2], 
            GT = SNP_file[i,3], 
            Site_Conf = SNP_file[i,4] 
            )) 
}}} 

Спасибо,

J

ответ

2

Вы можете избежать для цикла, так как сравнение векторизованы:

indx <- SNP_file[,1] >= Working[,1] & SNP_file[,1] <= Working[,2] 
[1] TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE 

Это выводит логический вектор строк, удовлетворяющих условию. Это очень полезно, потому что теперь вы можете использовать этот вектор в качестве индекса для подмножества.

newdf <- cbind(SNP_file[indx,2], Working[indx,2:3]) 

В этом случае я назначен второй столбец SNP и вторые и третьи столбцы Working в новый кадр данных. И только с строками, которые удовлетворяли условию.


Это всего лишь пример для наглядности. Ваш пример не был воспроизводимым, но попробуйте вместо этого:

Working <- Working[1:nrow(SNP_file),] 
indx <- as.numeric(SNP_file[,1]) >= as.numeric(Working[,1]) & as.numeric(SNP_file[,1]) <= as.numeric(Working[,2]) 
New <- data.frame(Chromosome =Working[indx, 1], 
        Start  = Working[indx, 2], 
        Stop  = Working[indx, 3], 
        GO  = Working[indx, 4], 
        Position = VCF[indx, 1], 
        REF  = SNP_file[indx,2], 
        GT  = SNP_file[indx,3], 
        Site_Conf = SNP_file[indx,4] 
            ) 

Обратите внимание, что длина двух кадров данных не равны. Первые 350 строк Working были сопоставлены с SNP_file. Если вы сравниваете по-другому, вы должны указать это.

данных

set.seed(7) 
SNP_file <- data.frame(x=sample(10), y=month.abb[1:10]) 
Working <- data.frame(x=sample(10), y=sample(20,10), z=(sample(LETTERS[1:10]))) 
+0

Как О.П. примечаниями, есть 350 строк в * SNP файл * и 6500 в * Рабочий * файл. Ваш код решает проблему для строк с одинаковыми индексами. Однако неясно, что нужно делать с другими 6150 строками * Рабочего * файла. Я что-то упускаю? (Мне кажется, что OP хотел отфильтровать один файл, используя информацию из другой, хотя это четко не указано.) – Daniel

+0

@ Даниэль Да, они должны это уточнить. На данный момент подмножество 'Working' для первых 350 строк будет производить сравнение« один к одному ». –

0

Это не ясно из исходного поста, что вы хотите достичь. Как индексы i и j соответствуют друг другу? Можете ли вы привести пример данных (ввод и нужный вывод)?

Цикл в коде повторяется 6500 * 350 = 2275000 раз, и он сравнивает каждый строки в SNP_file с каждым строк в Working.

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