#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=", ")
но, вероятно, в этом нет необходимости.