Извлечение самой длинной последовательности из файла разделителя вкладок

У меня есть файл файла tab delim, который содержит следующую информацию

>fasta 
    >ss_23_122_0_1
    MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS
    >ss_23_167_0_1
    WEIURIOWERWKLEJDSAJFASDGASZDTTQZWTEZQWTEZUQWEZQWTEZQTWEZTQW
    >ss_23_167_0_1
    MAASDASDWEPWERIWERIWER
    >ss_23_167_0_1
    QWEKCKLSDOIEOWIOWEUWWEUWEZURZEWURZUWEUZUQZUWZUE
    >ss_45_201_0_1
    HZTMKSKDIUWZUWEZTZWERWUEOIRUOEROOWEWERSDFSDFRRRETERTER
    >ss_45_201_0_1
    ZTTRASOIIDIFOSDIOFISDOFSDFQAWTZETQWE
    >ss_89_10_0_2
    NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP

Для таких идентификаторов, как ss_45_201_0_1 и ss_23_167_0_1, было несколько записей, я хотел бы сохранить только те записи, которые имеют максимальную длину из всех. Я хотел бы получить вывод следующим образом:

>fasta
    >ss_23_122_0_1
    MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS
    >ss_23_167_0_1
    WEIURIOWERWKLEJDSAJFASDGASZDTTQZWTEZQWTEZUQWEZQWTEZQTWEZTQW
    >ss_45_201_0_1
    HZTMKSKDIUWZUWEZTZWERWUEOIRUOEROOWEWERSDFSDFRRRETERTER
    >ss_89_10_0_2
    NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP

Я попробовал следующий код в R, но он не работает

Unique(fasta)

Может ли кто-нибудь направить меня. Как я могу получить только самую длинную последовательность для тех же идентификаторов, которые имеют несколько записей разной длины.


person Carol    schedule 28.02.2015    source источник


Ответы (2)


Вот три варианта для рассмотрения.

Вариант 1: База R

Удалите список, используйте nchar для этого и используйте ave, чтобы определить значения, которые нужно сохранить.

x <- nchar(unlist(l))
l[as.logical(ave(x, names(x), FUN = function(x) x == max(x)))]
# $ss_23_122_0_1
# [1] "MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS"
# 
# $ss_23_167_0_1
# [1] "WEIURIOWERWKLEJDSAJFASDGASZDTTQZWTEZQWTEZUQWEZQWTEZQTWEZTQW"
# 
# $ss_45_201_0_1
# [1] "HZTMKSKDIUWZUWEZTZWERWUEOIRUOEROOWEWERSDFSDFRRRETERTER"
# 
# $ss_89
library(data.table)
library(reshape2)
as.data.table(melt(l))[, Rnk := rank(nchar(as.character(value))), 
                       by = L1][Rnk == 1]
#                                                 value            L1 Rnk
# 1: MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS ss_23_122_0_1   1
# 2:                             MAASDASDWEPWERIWERIWER ss_23_167_0_1   1
# 3:               ZTTRASOIIDIFOSDIOFISDOFSDFQAWTZETQWE ss_45_201_0_1   1
# 4:      NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP  ss_89_10_0_2   1
0_2 # [1] "NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP"

Вариант 2: "data.table"

Используйте melt из "reshape2", чтобы создать data.frame. Используйте rank вместе с nchar для подмножества. (Я использовал ранг вместо ==, чтобы мне не пришлось использовать nchar дважды — я не проверял сравнительную эффективность.)

library(data.table)
library(reshape2)
as.data.table(melt(l))[, Rnk := rank(nchar(as.character(value))), 
                       by = L1][Rnk == 1]
#                                                 value            L1 Rnk
# 1: MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS ss_23_122_0_1   1
# 2:                             MAASDASDWEPWERIWERIWER ss_23_167_0_1   1
# 3:               ZTTRASOIIDIFOSDIOFISDOFSDFQAWTZETQWE ss_45_201_0_1   1
# 4:      NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP  ss_89_10_0_2   1

Вариант 3: "дплир"

Аналогичный подход к "data.table".

library(dplyr)
library(reshape2)
melt(l) %>%
  group_by(L1) %>%
  mutate(Rnk = dense_rank(nchar(as.character(value)))) %>%
  filter(Rnk == 1)
# Source: local data frame [4 x 3]
# Groups: L1
# 
#                                                value            L1 Rnk
# 1 MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS ss_23_122_0_1   1
# 2                             MAASDASDWEPWERIWERIWER ss_23_167_0_1   1
# 3               ZTTRASOIIDIFOSDIOFISDOFSDFQAWTZETQWE ss_45_201_0_1   1
# 4      NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP  ss_89_10_0_2   1
person A5C1D2H2I1M1N2O1R2T1    schedule 01.03.2015

Может быть, есть более элегантный способ...

l <-list(ss_23_122_0_1 = "MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS",
                           ss_23_167_0_1 = "WEIURIOWERWKLEJDSAJFASDGASZDTTQZWTEZQWTEZUQWEZQWTEZQTWEZTQW",
                           ss_23_167_0_1 = "MAASDASDWEPWERIWERIWER",
                           ss_23_167_0_1 = "QWEKCKLSDOIEOWIOWEUWWEUWEZURZEWURZUWEUZUQZUWZUE",
                           ss_45_201_0_1 = "HZTMKSKDIUWZUWEZTZWERWUEOIRUOEROOWEWERSDFSDFRRRETERTER",
                           ss_45_201_0_1 = "ZTTRASOIIDIFOSDIOFISDOFSDFQAWTZETQWE",
                           ss_89_10_0_2 = "NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP")

res <- split(l, names(l))
ind <- lapply(split(sapply(l, nchar), names(l)), which.max)
Map(function(x, y) x[y], res, ind)
$ss_23_122_0_1
$ss_23_122_0_1$ss_23_122_0_1
[1] "MJSDHWTEZTZEWUIASUDUAISDUASADIASDIAUSIDAUSIDCASDAS"


$ss_23_167_0_1
$ss_23_167_0_1$ss_23_167_0_1
[1] "WEIURIOWERWKLEJDSAJFASDGASZDTTQZWTEZQWTEZUQWEZQWTEZQTWEZTQW"


$ss_45_201_0_1
$ss_45_201_0_1$ss_45_201_0_1
[1] "HZTMKSKDIUWZUWEZTZWERWUEOIRUOEROOWEWERSDFSDFRRRETERTER"


$ss_89_10_0_2
$ss_89_10_0_2$ss_89_10_0_2
[1] "NJZTIWEIOIOIPIEPWIQPOEIQWIEPOQWIEPOQWIEPQIWEP"
person DatamineR    schedule 28.02.2015