R - Выполнить серию задач по группам в data.frame

У меня есть 2 (очень похожие, но не идентичные) data.frames, которые я делаю несколько задач (подробнее об этом в конце) с подмножеством. В data.frame есть 33 подмножества, над которыми я хочу выполнить задачи. Я знаю, что мог бы сделать это с помощью цикла for:

дф (1 и 2)

subset     value1     value2
1            1          1
1            2          5
2            3          2
2            2          4
........
33           234        21 
33           2          5

subsets <- c(1:33)
for (i in subsets){
     subset <- df[df$subset == i,]
     ...do tasks...
}

Тем не менее, я предполагаю, что должен быть лучший способ? Возможно с data.table, хотя это не является обязательным требованием. Некоторое руководство о том, с чего начать, было бы полезно.

Задачи

Задачи, которые я делаю, включают в себя:

  • Создание объектов GRanges
  • найти перекрытия между df1 и 2
  • Используйте перекрытия для объединения сегментов

Пример:

Ниже для контекста. Все ниже работает нормально, если я использую структуру forloop выше, но я просто пытаюсь обдумать, как это сделать для каждого файла, а не для всего df, без выполнения цикла for для каждого файла.

df1

File   Chromosome      Min      Max    CN.State
C_28        1            1       100        1
C_28        1            150     200        1
A_1         1            20       25        3
A_1         1            150     200        3

df1 <- data.frame(File=c("C_28","C_28","A_1","A_1"), 
+                      Chromosome=rep(1, 4),
+                      Min=c(1, 150, 20, 150),
+                      Max=c(100, 200, 25, 200),
+                      CN.State=c(1,1,3,3))

df2

File Chromosome Min Max CN.State
C_28          1   1 210        1
A_1           1  15 250        3

df2 <- data.frame(File=c("C_28","A_1"), 
+                      Chromosome=rep(1, 2),
+                      Min=c(1, 15),
+                      Max=c(210, 250),
+                      CN.State=c(1,3))

Упрощенные задачи

Сделать объекты геномных диапазонов

df1 <- makeGRangesFromDataFrame(df1, keep.extra.columns = TRUE, seqnames.field="Chromosome", start.field="Min", end.field = "Max")
df2 <- makeGRangesFromDataFrame(df2, keep.extra.columns = TRUE, seqnames.field = "Chromosome", start.field = "Min", end.field = "Max")

Найти совпадения и объединить

hits <- findOverlaps(df1, df2)
ranges(df1)[queryHits(hits)] <- ranges(df2)[subjectHits(hits)]

0 ответов

Другие вопросы по тегам