вставить объединенные строки, если имена строк совпадают

#r #dataframe #gsub

#r #фрейм данных #gsub

Вопрос:

У меня есть два фрейма данных, которые частично выглядят следующим образом:

d1

                 SRR1686681 SRR1686679 SRR1686680 SRR1686686 ERR1014349 ERR1014347 
FJ889562.1.1501          0          0          0          0          0          0
JQ236848.1.1432          1          0          1          0          0          0
EU431805.1.1493          0          0          0          0          0          0
EU537467.1.1392          1          0          0          0         10          0
JF500179.1.1495          0          0          0          0          0          0
HM128723.1.1454          0          0          0          0          0          0
  

и d2

                 taxonomy               X                  X.1               X.2                X.3              X.4                               X.5
FJ889562.1.1501 Bacteria  Proteobacteria  Alphaproteobacteria       Rhizobiales       Rhodobiaceae     Parvibaculum              uncultured bacterium
JQ236848.1.1432 Bacteria  Proteobacteria   Betaproteobacteria   Burkholderiales     Comamonadaceae       Variovorax              uncultured bacterium
EU431805.1.1493 Bacteria  Proteobacteria  Alphaproteobacteria       Rhizobiales       Rhizobiaceae        Rhizobium        Agrobacterium sp. BKBLPu14
EU537467.1.1392 Bacteria  Proteobacteria   Betaproteobacteria     Rhodocyclales     Rhodocyclaceae         Azoarcus                  bacterium SL4.29
JF500179.1.1495 Bacteria  Proteobacteria  Alphaproteobacteria  Sphingomonadales  Sphingomonadaceae  Novosphingobium  uncultured alpha proteobacterium
HM128723.1.1454 Bacteria  Proteobacteria   Betaproteobacteria   Burkholderiales     Comamonadaceae       Variovorax              Variovorax sp. SOD31
  

Я хочу заменить совпадающие имена строк в d1 на соответствующую объединенную строку во 2.

например, если FJ889562.1.1501 найден в d2, то его следует заменить на «Бактерии, протеобактерии, альфапротеобактерии, Rhizobiales, Rhodobiaceae, Parvibaculum, некультурные бактерии» в d1.

Это слишком запутанно?

Спасибо за любую помощь.

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

1. Было бы полезно, если бы вы использовали dput() , чтобы мы могли протестировать некоторые решения с вашими данными. Для пояснения, вы хотите, чтобы первое название строки в d1 читалось как «Бактерии, протеобактерии, альфапротеобактерии, Rhizobiales, Rhodobiaceae, Parvibaculum, некультурная бактерия»?

2. Могу я спросить, почему вы хотели бы это сделать? Выполнение именно того, что вы хотите, приведет к тому, что данные будут очень сложными для анализа…

Ответ №1:

Отказ от ответственности: Я не отвечаю на ваш вопрос litteral, но рассказываю вам, что вы должны сделать, чтобы объединить свои данные и иметь возможность выполнять интересные анализы на них позже. Представление объединенной таксономии в виде имен строк имеет очень мало смысла, обычно это вопрос XY!

Прекратите использовать имена строк для хранения полезной информации. В data.frame данные должны храниться в столбцах.

Итак, сначала преобразуйте имена строк в настоящие столбцы. Здесь имена строк кажутся уникальными идентификаторами:

 d1$uid <- row.names(d1)
d2$uid <- row.names(d2)
  

Теперь мне кажется, что ваша конечная цель — собрать всю информацию в одном data.frame. Итак, что вы хотите сделать, это объединить data.frames. Есть много способов сделать это, лично мне нравится синтаксис из package dplyr . Базовая функция R будет merge .

 library("dplyr")
fused_d <- left_join(d1, d2, by="uid")
  

Это сохранит все строки в d1, но перенесет информацию из d2 при наличии соответствующего uid. Чтобы сохранить все строки в d1 или d2, используйте full_join вместо этого.

Примечание: ваши данные не выглядят загруженными должным образом. Во-первых, вам следует избегать загрузки чего-либо в виде имен строк.

Во-вторых, имена столбцов d2 неверны. Почему вы не даете правильные имена всей информации, составляющей таксономию? Кажется, вы хотите объединить их, но это гораздо полезнее без объединения, например, представьте, что вы хотите отфильтровать «Alphaproteobacteria» и т.д.

Ответ №2:

Вы можете сделать это с помощью слияния, см. ?merge Подробности:

 > merge(d1, d2, by="row.names")

        Row.names SRR1686681 SRR1686679 SRR1686680 SRR1686686 ERR1014349 ERR1014347
1 EU431805.1.1493          0          0          0          0          0          0
2 EU537467.1.1392          1          0          0          0         10          0
3 FJ889562.1.1501          0          0          0          0          0          0
4 HM128723.1.1454          0          0          0          0          0          0
5 JF500179.1.1495          0          0          0          0          0          0
6 JQ236848.1.1432          1          0          1          0          0          0
  taxonomy              X                 X.1              X.2               X.3
1 Bacteria Proteobacteria Alphaproteobacteria      Rhizobiales      Rhizobiaceae
2 Bacteria Proteobacteria  Betaproteobacteria    Rhodocyclales    Rhodocyclaceae
3 Bacteria Proteobacteria Alphaproteobacteria      Rhizobiales      Rhodobiaceae
4 Bacteria Proteobacteria  Betaproteobacteria  Burkholderiales    Comamonadaceae
5 Bacteria Proteobacteria Alphaproteobacteria Sphingomonadales Sphingomonadaceae
6 Bacteria Proteobacteria  Betaproteobacteria  Burkholderiales    Comamonadaceae
              X.4                              X.5
1       Rhizobium       Agrobacterium_sp._BKBLPu14
2        Azoarcus                 bacterium_SL4.29
3    Parvibaculum             uncultured_bacterium
4      Variovorax             Variovorax_sp._SOD31
5 Novosphingobium uncultured_alpha_proteobacterium
6      Variovorax             uncultured_bacterium
  

Оттуда, если вы все еще хотите изменить row.names для использования таксономической информации, вы можете сделать это с помощью paste(..., collapse=", ") но, вероятно, в этом нет необходимости.