Как cbind data.frames в R использует идентификаторы в определенном столбце

#r #dataframe #cbind

Вопрос:

У меня есть 2 кадра данных:

df1

     Taxa        Env  Correlation
1  C1161         pH  -0.209916044
2  C1161         pH   0.101338976
3  C1161       Temp  -0.228451375
4  C1161       Temp  -0.218456646
5  C1161         TS   0.255112839
6   C26         NH4   0.379192859
7   C26        Prot   0.327016026
8   C26        Prot   0.602990615
9   C26       Carbo  -0.102919129
10  C26       Carbo   0.481216962
11 C1815         pH  -0.403348271
12 C1815         pH   0.126527189
13 C1815       Temp  -0.125038666
14 C1815       Temp  -0.343674237
 

df2

        Domain                Phylum
C1161 Bacteria        Actinobacteria
C1714 Bacteria        Actinobacteria
C26   Bacteria         Bacteroidetes
C895  Bacteria            Firmicutes
C1020 Bacteria            Firmicutes
C1815 Bacteria unclassified_Bacteria
C26   Bacteria            Firmicutes
C1620 Bacteria            Firmicutes
C822  Bacteria            Firmicutes
 

Я хочу связать оба кадра данных, используя идентификаторы в столбце таксонов df1, и объединить с df2, используя имена строк.

Моя проблема в том, что я не могу использовать имена строк df1, потому что идентификаторы в столбце Таксонов могут присутствовать еще 2 раза.

Я просто хочу что-то вроде:

     Taxa        Env  Correlation    Domain          Phylum
1  C1161         pH  -0.209916044   Bacteria        Actinobacteria
2  C1161         pH   0.101338976   Bacteria        Actinobacteria
3  C1161       Temp  -0.228451375   Bacteria        Actinobacteria
4  C1161       Temp  -0.218456646   Bacteria        Actinobacteria
5  C1161         TS   0.255112839   Bacteria        Actinobacteria
6   C26         NH4   0.379192859   Bacteria            Firmicutes
7   C26        Prot   0.327016026   Bacteria            Firmicutes
8   C26        Prot   0.602990615   Bacteria            Firmicutes
9   C26       Carbo  -0.102919129   Bacteria            Firmicutes
10  C26       Carbo   0.481216962   Bacteria            Firmicutes
11 C1815         pH  -0.403348271   Bacteria unclassified_Bacteria
12 C1815         pH   0.126527189   Bacteria unclassified_Bacteria
13 C1815       Temp  -0.125038666   Bacteria unclassified_Bacteria
14 C1815       Temp  -0.343674237   Bacteria unclassified_Bacteria
 

Я пытался:

  cbind(df1$Taxa, df2)

 merge(rownames(df2), df1, by = "Taxa")
 

Спасибо

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

1. C26 дважды указывается в качестве имени строки в df2 с разными значениями для Phylum . Похоже, что вы хотите присоединиться к этим двум фреймам данных слева.

Ответ №1:

 library(tibble)
library(dplyr)

left_join(df1, rownames_to_column(df2, "Taxa"), by = "Taxa")
 

В базе R:

 df2$Taxa <- rownames(df2)

merge(df1, 
      df2,
      all.x = T,
      by = "Taxa")
 

Примечание: Я удалил первый экземпляр C26 from df2 на основе предоставленных вами выходных данных.

Выход

     Taxa   Env Correlation   Domain                Phylum
1  C1161    pH  -0.2099160 Bacteria        Actinobacteria
2  C1161    pH   0.1013390 Bacteria        Actinobacteria
3  C1161  Temp  -0.2284514 Bacteria        Actinobacteria
4  C1161  Temp  -0.2184566 Bacteria        Actinobacteria
5  C1161    TS   0.2551128 Bacteria        Actinobacteria
6    C26   NH4   0.3791929 Bacteria            Firmicutes
7    C26  Prot   0.3270160 Bacteria            Firmicutes
8    C26  Prot   0.6029906 Bacteria            Firmicutes
9    C26 Carbo  -0.1029191 Bacteria            Firmicutes
10   C26 Carbo   0.4812170 Bacteria            Firmicutes
11 C1815    pH  -0.4033483 Bacteria unclassified_Bacteria
12 C1815    pH   0.1265272 Bacteria unclassified_Bacteria
13 C1815  Temp  -0.1250387 Bacteria unclassified_Bacteria
14 C1815  Temp  -0.3436742 Bacteria unclassified_Bacteria
 

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

1. ,@LMc: Как вы разгадали имена строк дуплета?!

2. @TarJae хорошая мысль-я хотел включить примечание. Я удалил второй экземпляр на основе желаемого результата, так как у вас не может быть повторяющихся имен строк. Не знаю, как ОП включил это, но я предполагаю, что это была ошибка при вводе, когда они опубликовали вопрос.