2017-09-28 2 views
-4

Ich habe eine große data.frame in R mit Tausenden von Zeilen und 4 Spalten. Zum Beispiel:Ersetze Zeilennamen in einer Spalte

Chromosome Start  End Count 
1 NC_031985.1 16255093 16255094  1 
2 NC_031972.1 11505205 11505206  1 
3 NC_031971.1 24441227 24441228  1 
4 NC_031977.1 29030540 29030541  1 
5 NC_031969.1 595867 595868  1 
6 NC_031986.1 40147812 40147813  1 

Ich habe diese data.frame mit den Chromosomen Namen oben entsprechend

LG1  NC_031965.1 
LG2  NC_031966.1 
LG3a NC_031967.1 
LG3b NC_031968.1 
LG4  NC_031969.1 
LG5  NC_031970.1 
LG6  NC_031971.1 
LG7  NC_031972.1 
LG8  NC_031973.1 
LG9  NC_031974.1 
LG10 NC_031975.1 
LG11 NC_031976.1 
LG12 NC_031977.1 
LG13 NC_031978.1 
LG14 NC_031979.1 
LG15 NC_031980.1 
LG16 NC_031987.1 
LG17 NC_031981.1 
LG18 NC_031982.1 
LG19 NC_031983.1 
LG20 NC_031984.1 
LG22 NC_031985.1 
LG23 NC_031986.1 

Ich möchte alle Zeilennamen der großen Matrix mit den Chromosomen Namen ersetzen, wie aufgeführt und erhalten:

Chromosome Start  End Count 
1 LG22  16255093 16255094  1 
2 LG7   11505205 11505206  1 
3 LG6   24441227 24441228  1 
4 LG12  29030540 29030541  1 
5 LG4   595867 595868  1 
6 LG23  40147812 40147813  1 

Weiß jemand, welcher ist der weniger schmerzhafte Weg, dies zu tun? Es könnte einfach sein (oder nicht), aber meine Erfahrung in R ist begrenzt.

Vielen Dank!

+0

Bitte geben Sie ein [reproduzierbares Beispiel] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) einschließlich Ihrer gewünschten Ausgabe an. – lmo

+0

versuchen Sie biomart ... aber Sie könnten mehr Hilfe bekommen auf https://www.biostars.org/ – Jimbou

+0

Ich habe die Frage bearbeitet. – Ioannis

Antwort

0

Wie hier in den Kommentaren diskutiert ist die dplyr Lösung, wenn Menschen suchen:

library(dplyr) 
df %>% 
    inner_join(chromo_names, by = c("Chromosome" = "V2")) %>% 
    select(Chromosome = V1, Start, End, Count) 

Dies gibt eine Warnmeldung aus, dass die beiden fusionierenden Spalten unterschiedliche Faktorstufen hat. Sie können entweder das ignorieren und mit Zeichen arbeiten oder die fusionierte Spalte zu einem Faktor konvertieren wie:

df %>% 
    inner_join(chromo_names, by = c("Chromosome" = "V2")) %>% 
    select(Chromosome = V1, Start, End, Count) %>% 
    mutate(Chromosome = as.factor(Chromosome)) 

Hier ist eine Base-R Lösung:

merged = merge(df, chromo_names, 
       by.x = "Chromosome", 
       by.y = "V2", 
       sort = FALSE) 

merged = merged[c(5,2:4)] 
names(merged)[1] = "Chromosome" 

Ergebnis:

Chromosome Start  End Count 
1  LG22 16255093 16255094  1 
2  LG7 11505205 11505206  1 
3  LG6 24441227 24441228  1 
4  LG12 29030540 29030541  1 
5  LG4 595867 595868  1 
6  LG23 40147812 40147813  1 

Daten:

df = read.table(text = " Chromosome Start End Count 
       1 NC_031985.1 16255093 16255094  1 
       2 NC_031972.1 11505205 11505206  1 
       3 NC_031971.1 24441227 24441228  1 
       4 NC_031977.1 29030540 29030541  1 
       5 NC_031969.1 595867 595868  1 
       6 NC_031986.1 40147812 40147813  1", header = TRUE) 

chromo_names = read.table(text = "LG1  NC_031965.1 
         LG2  NC_031966.1 
         LG3a NC_031967.1 
         LG3b NC_031968.1 
         LG4  NC_031969.1 
         LG5  NC_031970.1 
         LG6  NC_031971.1 
         LG7  NC_031972.1 
         LG8  NC_031973.1 
         LG9  NC_031974.1 
         LG10 NC_031975.1 
         LG11 NC_031976.1 
         LG12 NC_031977.1 
         LG13 NC_031978.1 
         LG14 NC_031979.1 
         LG15 NC_031980.1 
         LG16 NC_031987.1 
         LG17 NC_031981.1 
         LG18 NC_031982.1 
         LG19 NC_031983.1 
         LG20 NC_031984.1 
         LG22 NC_031985.1 
         LG23 NC_031986.1", header = FALSE) 
Verwandte Themen