2016-03-25 6 views
0

Так что я все еще довольно новичок в R, и я осматривал вопрос о том, как фильтровать фреймворк на основе нескольких ограничений и вычислений, чтобы он возвращал новый фреймворк данных. Я смотрел вокруг, и я знаю, как фильтровать с помощью %in%, и я использовал это много раз, но я ищу несколько советов по фильтрации набора данных за пределы одного или двух ограничений, где этот синтаксис можно использовать.Фильтрация R data.frame на основе нескольких ограничений

У меня есть dataframe с 78,812 строк. В столбце PeakName у меня есть идентификаторы, указывающие на «пик» в моих данных. Есть только 13 000 пиков, поэтому каждый пик часто появляется несколько раз в кадре данных. Для каждого уникального PeakName существует множество motifs с различными значениями PValue, связанными с ними. Каждый мотив также имеет start и stop.

Моя цель состоит в том, чтобы создать новый dataframe где:

  1. для каждого PeakName я найти motif с наименьшим PValue и добавить его в новый dataframe
  2. с использованием start и stop места для мотивов , я обнаруживаю, есть ли какие-либо мотивы, которые перекрывают тот, который был просто добавлен в новый фреймворк данных. Если есть, я удаляю их как возможности для добавления в новый dataframe.
  3. если есть motifs для этого PeakName, я возвращаюсь к шагу 1 и повторяю этот процесс до тех пор, пока не будет возможно больше motifs слева.
  4. ПРИМЕЧАНИЕ: если есть два пика с равным PValue, где это значение в настоящее время является самым низким значением, я бы выбрал мотив «Первичный» вместо «Вторичного» мотива.

Пример (упрощенный) Данные:

Motif  Start Stop PValue  PeakName 
Primary 4  10  5   Peak1 
Primary 5  11  4   Peak1 
Secondary 12  18  8   Peak1 
Secondary 8  16  6   Peak1 
Primary 12  18  9   Peak1 
Secondary 3  9  7   Peak2 
Primary 5  11  7   Peak2 

Желаемый выход выше данных:

Motif  Start Stop PValue  PeakName 
Primary 5  11  4   Peak1 
Secondary 12  18  8   Peak1 
Primary 5  11  7   Peak2 

Любые советы будут очень высокую оценку, так как я был сбит с толку о том, как написать что-то сделайте это, и это задача, которую, я считаю, должна быть довольно простой, но меня ускользает. Благодаря!

+2

Я не думаю, что вы объяснили правила в вашей голове, что позволило вам производство этой продукции. Предположим ли мы поставить какой-то другой вес на первичные и вторичные мотивы? Почему «Вторичный 3 9 7 Peak2» не подходит для включения? Почему была выбрана вторая строка в первом перекрытии (строки 1 и 2), но выбрана первая строка второго перекрытия (строки 3 и 4). Программирование требует гораздо большего, чем понимание синтаксиса. Наиболее критично это требует четкого, однозначного описания проблемы. –

+0

'Secondary 3 9 7 Peak2' не подлежит определению в соответствии с правилом' (4) ', поскольку он имеет тот же PValue, что и основной мотив в Peak2, но когда это так, я бы поставил приоритет на Primary вместо Secondary , Вторая строка была выбрана из-за всех PValues ​​Peak1, у нее самая низкая. Строка сначала выбирается минимальным PValue, присутствующим во второй строке. Это перекрывает первую, четвертую и пятую строки, поэтому эти строки не были включены в окончательный вывод.Извините, я думал, что мое объяснение было более ясным, чем кажется – Rene

ответ

0

Возможно, вам захочется немного почистить, чтобы уловить края, такие как галстуки. Обратите внимание на использование в колонке «хелпер», чтобы иметь дело с Primary/Secondary выбором мотива:

df2 <- {} 
for (peak in unique(df$PeakName)) { 
    tmp <- subset(df, PeakName==peak) 
    tmp$helper <- tmp$Pvalue + ifelse(tmp$Motif=="S", 0.1, 0) 

    while (nrow(tmp) > 0) { 
     ind <- which.min(tmp$helper) 
     df2 <- rbind(df2, tmp[ind,]) 
     remove <- (tmp$Start >= tmp$Start[ind] & tmp$Start <= tmp$Stop[ind]) | (tmp$Stop >= tmp$Start[ind] & tmp$Stop <= tmp$Stop[ind]) 
     tmp <- tmp[!remove,] 
    } 
} 
+0

любые предложения о том, как изменить столбец «помощник» при работе с выбором мотива, если у меня есть 6 разных мотивов вместо двух? В одном из моих файлов у меня есть: «Tbr_prim_8bp», «Tbr_prim_12bp», «Tbr_sec_8bp», «Tbr_sec_12bp», «Smad3_prim», «Smad3_sec», и это тот порядок, в котором я бы хотел расставить приоритеты в этом состоянии. – Rene

+0

Добавить 0.1, 0.2, ..., 0.6 в соответствующем порядке – fanli

+0

Я предполагаю, что я немного смущен тем, как будет работать инструкция ifelse? Вы подразумеваете, что мне нужен уникальный идентификатор для каждого из моих мотивов, сопровождаемый 0,1, 0,2 и т. Д. В том порядке, в котором я хотел бы оценивать мотивы? Поэтому мне понадобится 'tmp $ helper <- tmp $ Pvalue + ifelse (tmp $ Motif ==" Tbr_prim_8bp ", 0,1, 0)', а также 'tmp $ helper <- tmp $ Pvalue + ifelse (tmp $ Motif == "Tbr_prim_12bp", 0.2, 0) 'и т. Д.? – Rene

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