Вот один из возможных способов. Вы выбираете строки с геном и CDS. Затем вы группируете свои данные с помощью Start и END. Могут быть группы START/END с 1 или 3+ строками. Поэтому вы хотите, чтобы вы выбрали группы START/END с двумя строками. Кроме того, вы хотите убедиться, что у вас есть как ген, так и CDS (length(unique(Tipo)) == 2
). И, наконец, вы берете не-NA элемент в Accesion1 и Accesion 2.
filter(df, Tipo %in% c("gene", "CDS")) %>%
group_by(Start, End) %>%
filter(n() == 2 & length(unique(Tipo)) == 2) %>%
summarise(Accesion1 = Accesion1[!is.na(Accesion1)],
Accesion2 = Accesion2[!is.na(Accesion2)])
Вот псевдо пример.
mydf <- structure(list(Tipo = structure(c(2L, 1L, 2L, 1L, 2L, 2L), .Label = c("CDS",
"gene"), class = "factor"), Start = c(197, 197, 1717, 1717, 2864,
2864), End = c(1558, 1558, 2853, 2853, 3112, 3112), Strand = structure(c(1L,
1L, 1L, 1L, 1L, 1L), .Label = "+", class = "factor"), Accesion1 = structure(c(NA,
1L, NA, 2L, NA, 3L), .Label = c("NP_344554", "NP_344555", "NP_344556"
), class = "factor"), Accesion2 = structure(c(1L, NA, 2L, NA,
3L, NA), .Label = c("SP_0001", "SP_0002", "SP_0003"), class = "factor")), .Names = c("Tipo",
"Start", "End", "Strand", "Accesion1", "Accesion2"), row.names = c(NA,
-6L), class = "data.frame")
Tipo Start End Strand Accesion1 Accesion2
1 gene 197 1558 + <NA> SP_0001
2 CDS 197 1558 + NP_344554 <NA>
3 gene 1717 2853 + <NA> SP_0002
4 CDS 1717 2853 + NP_344555 <NA>
5 gene 2864 3112 + <NA> SP_0003
6 gene 2864 3112 + NP_344556 <NA>
filter(mydf, Tipo %in% c("gene", "CDS")) %>%
group_by(Start, End) %>%
filter(n() == 2 & length(unique(Tipo)) == 2) %>%
summarise(Accesion1 = Accesion1[!is.na(Accesion1)],
Accesion2 = Accesion2[!is.na(Accesion2)])
# Start End Accesion1 Accesion2
#1 197 1558 NP_344554 SP_0001
#2 1717 2853 NP_344555 SP_0002
Вы, возможно, потребуется предоставить немного больше информации, о том, 'ген/CDS' происходит в парах или нет. Неясно, потому что вы упоминали, что существуют другие значения «тРНК, область, экзон» и т. Д. Предположим, если 'df1 $ Start [6] <- 2964', что будет ожидаемым результатом для примера набора данных – akrun
Да, они попадают парами Решение, которое вы дали, похоже, работает очень хорошо. Потому что некоторые дополнительные Tipo присутствуют, некоторые NA появляются, но я могу легко отбросить их с помощью complete.cases Я искал решение с dplyr, просто потому, что мне это нравится. Но решение (вы удалили?) отлично работает –
Не могли бы вы проверить, работает ли эта библиотека 'data.table ', setDT (df1) [, id: = cumsum (Tipo ==' gene ')] [, list (Accesion1 = na.omit (Accesion1), Accesion2 = na.omit (Accesion2)), list (id, Start, End)] ' – akrun