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)]