Возвращает одну из нескольких строк с частично совпадающими записями

#r

#r

Вопрос:

У меня есть набор данных с именем proteome. В нем 14 столбцов и тысячи строк.

 dput(Proteome)
    structure(list(Protein.name = structure(c(1L, 1L, 1L, 1L, 2L, 
    3L), .Label = c("HCTF", "IFT", "ROSF"), class = "factor"), X..Proteins = c(5L, 
    5L, 5L, 5L, 3L, 7L), X..PSMs = c(3L, 1L, 6L, 2L, 2L, 4L), Previous.5.amino.acids =   structure(c(4L, 
5L, 4L, 2L, 3L, 1L), .Label = c("CWYAT", "FCLKP", "MGCPT", "NCTMY", 
"TMYFC"), class = "factor"), Sequence = structure(c(5L, 1L, 4L, 
2L, 3L, 6L), .Label = c("FCLKPGCNFHAESTRGYR", "GCNFHAESTR", "GFGFNWPHAVR", 
"GHFCLKPGCNFHAESTR", "GHFCLKPGCNFHAESTRGYR", "GNFSVKLMNR"), class = "factor")), .Names = c("Protein.name", 
"X..Proteins", "X..PSMs", "Previous.5.amino.acids", "Sequence"
), class = "data.frame", row.names = c(NA, -6L))
  

Интересующий столбец в этом наборе данных — «Последовательность». В строке 2 этого столбца отсутствуют первые две буквы строки 1; в строке 3 отсутствуют последние три буквы строки 1; в строке 4 отсутствуют первые семь и последние три буквы строки 1.

Строки 2, 3 и 4 отражают артефакты научного метода, который я использовал для генерации данных, и поэтому я хочу удалить эти записи.

Я хочу, чтобы R возвращал только одну из четырех строк, в идеале строку 1, и удалял остальные. Способ, которым R может это сделать, заключается в том, чтобы сначала найти все строки с совпадающей строкой букв, а затем исключить такие строки, сохранив только одну. Например, в приведенном выше наборе данных GCNFHAESTR совпадает во всех четырех строках, поэтому я хочу, чтобы R возвращал мне только одну строку, в идеале верхнюю. Но я не знаю, как это сделать.

Для дальнейшего пояснения, «Последовательность» содержит сотни строк с частично совпадающими записями, но совпадающие записи в этих строках отличаются от той, что показана в примере выше. Например, возможно, что строки № 35 и 39 содержат следующие записи (строка 35: GNYTCAGCWPFK и строка 36: YTCAGCWPFK). Поскольку совпадающие записи в этих строках полностью отличаются от записей в приведенном выше примере, я не могу заранее объявить строку. Итак, я хочу придумать механизм, который позволяет мне обнаруживать все те строки, в которых есть частично совпадающие записи, а затем сохранять только одну из них, удаляя другие.

Я с нетерпением жду ответа экспертов.

Спасибо!

Комментарии:

1. Я думаю, что вы систематически путаете строки и столбцы в своем описании. В нынешнем виде текст не совсем понятен.

2. Из того, что я не понял, вы хотите, чтобы в столбце Sequence был набор строк, правильно?

3. @FelipeAlvarenga да, извините, что я забыл упомянуть об этом в своем вопросе. Спасибо!

Ответ №1:

Если я правильно понял, вам просто нужно подмножество ваших данных в соответствии с наличием нужной строки. Используйте grepl для этого.

 aa <- structure(list(Protein.name = structure(c(1L, 1L, 1L, 1L, 2L, 3L),
                                              .Label = c("HCTF", "IFT", "ROSF"),
                                              class = "factor"),
                     X..Proteins = c(5L, 5L, 5L, 5L, 3L, 7L),
                     X..PSMs = c(3L, 1L, 6L, 2L, 2L, 4L), 
                     Previous.5.amino.acids =   structure(c(4L, 5L, 4L, 2L, 3L, 1L),
                                                          .Label = c("CWYAT", "FCLKP", "MGCPT", "NCTMY", "TMYFC"),
                                                          class = "factor"),
                     Sequence = structure(c(5L, 1L, 4L, 2L, 3L, 6L),
                                          .Label = c("FCLKPGCNFHAESTRGYR", "GCNFHAESTR", "GFGFNWPHAVR",
                                                     "GHFCLKPGCNFHAESTR", "GHFCLKPGCNFHAESTRGYR", "GNFSVKLMNR"), 
                                          class = "factor")), 
                .Names = c("Protein.name", "X..Proteins", "X..PSMs", "Previous.5.amino.acids", "Sequence"),
                class = "data.frame", row.names = c(NA, -6L))
  

Полезно заранее объявить строку

 myStrToDetect <-'GCNFHAESTR'

#the following line filters the data set into those where "Sequence" has the pattern you provided (4 rows)
matching_df <- aa[grepl(myStrToDetect , aa$Sequence),]

Protein.name X..Proteins X..PSMs Previous.5.amino.acids             Sequence
1         HCTF           5       3                  NCTMY GHFCLKPGCNFHAESTRGYR
2         HCTF           5       1                  TMYFC   FCLKPGCNFHAESTRGYR
3         HCTF           5       6                  NCTMY    GHFCLKPGCNFHAESTR
4         HCTF           5       2                  FCLKP           GCNFHAESTR

# This next command chooses only the first line, if there are multiple occurrences
head(matching_df, 1)

  Protein.name X..Proteins X..PSMs Previous.5.amino.acids             Sequence
1         HCTF           5       3                  NCTMY GHFCLKPGCNFHAESTRGYR
  

Комментарии:

1. Привет, Фелипе, спасибо, что нашел время ответить на это. Поскольку в моем наборе данных тысячи строк и есть несколько случаев, когда я вижу перекрывающиеся последовательности, я не могу заранее объявить последовательность. В приведенном выше примере я показал только четыре такие строки. Вот почему я хочу придумать механизм, который позволяет мне сохранять только одну из перекрывающихся строк всякий раз, когда R встречает такие строки. Пожалуйста, дайте мне знать, если это непонятно. Спасибо!

2. Я отредактировал ответ, чтобы быть более точным. Если это не то, что вы ищете, отредактируйте свой вопрос с помощью более точной формулировки. Таким образом, мы сможем помочь вам лучше

3. Спасибо! Я отредактировал вопрос, чтобы еще больше прояснить его.