İşte olası bir yol. Gen ve CDS ile satırları seçersiniz. Ardından, verilerinizi Start ve END ile gruplandırırsınız. 1 veya 3+ satır içeren START/END grupları olabilir. Yani, iki satırlı START/END gruplarını seçtiğinizden emin olmak istersiniz. Ayrıca, hem gen hem de CDS (length(unique(Tipo)) == 2
) olduğundan emin olmak istersiniz. Son olarak,
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)])
İşte sahte örnektir Accesion1 ve üyeliğiyle 2.
olmayan NA eleman alır.
summarize_each
ile
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
'gen/CDS' çiftler halinde veya olmasın deneyebilirsin. Eğer df1 $ Başlangıç [6] <- 2964' ise örnek verisi – akrun
için beklenen sonuç ne olurdu, varsayalım. Verdiğiniz çözüm çok iyi çalışıyor gibi görünüyor. Bazı ekstra Tipo mevcut olduğu için, bazı NA görünür, ama ben kolayca onları ile atabilirsiniz Ben dplyr ile bir çözüm arıyordum, sadece onu seviyorum çünkü. Ama çözüm (sildiniz mi?) güzel çalışır –
Bu çalışıp çalışmadığını denetler misiniz kitaplık (data.table); setDT (df1) [, id: = cumsum (Tipo == 'gen')] [, liste (Accesion1 = na.omit (Accesion1), Accesion2 = na.omit (Accesion2)), liste (id, Başlat, Son)] ' – akrun