2017-06-22 7 views
1

Ich habe einen Datenrahmen ‚clinDF‘, die ich habe auf einer anderen zur Aktualisierung basiert, ‚parsingDF‘, durch R. Lassen Sie uns sagen:Analysieren von Datenrahmen basierend auf einem anderen Datenrahmen? (? Zelle für Zelle)

#clinDF 
    P1 P2 P3 P4 
A M F M M 
B H M L M 
C 3 4 1 0 

#parsingDF 
    feat var col 
[1] A  M #B3E2CD 
[2] A  F #E41A1C 
[3] B  H #A6CEE3 
[4] B  M #FCCDE5 
[5] B  L #8DD3C7 
[6] C  0 #BC80BD 
[7] C  1 #A6CEE3 
[8] C  3 #B3E2CD 
[9] C  4 #E41A1C 

Mein Ziel ist es clinDF so zu analysieren, dass ich bekomme die entsprechende col:

#out: 
    P1  P2  P3  P4 
A #B3E2CD #E41A1C #B3E2CD #B3E2CD 
B #A6CEE3 #FCCDE5 #8DD3C7 #FCCDE5 
C #B3E2CD #E41A1C #A6CEE3 #BC80BD 

Idealerweise weise~~POS=HEADCOMP möchte ich den Code so allgemein wie möglich sein und nicht alle in clinDF Wechsel von clinDF[clinDF==3]=#B3E2CD Einstellung. Gibt es einen besseren Weg, dies zu tun, als mit zwei for Schleifen, Zeile für Zeile und Spalte für Spalte zu lesen?

Vielen Dank im Voraus

+0

Eigentlich jetzt, dass ich es sehe sie sind beide Matrizen, aber mit data.frame arbeiten die gleichen ich – Sosi

Antwort

2

Hier ist meine Lösung ~

library(Reshape) 
library(Reshape2) 
    Table1=melt(as.matrix(clinDF)) 
    Table1=merge(Table1,parsingDF,by.x=c('X1','value'),by.y=c('feat','var'),all.x=T) 
    dcast(Table1, X1~X2, value.var="col") 

    X1 P1  P2  P3  P4 
1 A #B3E2CD #E41A1C#B3E2CD #B3E2CD 
2 B #A6CEE3 #FCCDE5 #8DD3C7 #FCCDE5 
3 C#B3E2CD #E41A1C#A6CEE3 #BC80BD 
2

wir dies mit data.table tun können. Da beide Datasets Matrizen sind, melt das "clinDF" zu "long" -Format, zu data.table konvertieren(), beitreten on die 'feat/var' 'Var1/Wert' Spalten des Datasets und umformen es zurück zu 'Wide' reshape2 Format mit acast von

library(data.table) 
library(reshape2) 
dM <- melt(clinDF) 
setDT(dM) 
acast(as.data.table(parsingDF)[dM, on = .(feat = Var1, var = value)], 
       feat ~ Var2, value.var = 'col') 
#  P1  P2  P3  P4  
#A "#B3E2CD" "#E41A1C" "#B3E2CD" "#B3E2CD" 
#B "#A6CEE3" "#FCCDE5" "#8DD3C7" "#FCCDE5" 
#C "#B3E2CD" "#E41A1C" "#A6CEE3" "#BC80BD" 
3

Hier ist eine Lösung Funktionen von tidyverse verwenden. clinDF2 wäre die endgültige Ausgabe.

# Create example dataframes 
clinDF <- read.table(text = " P1 P2 P3 P4 
A M F M M 
        B H M L M 
        C 3 4 1 0", 
        header = TRUE, stringsAsFactors = FALSE) 

parsingDF <- read.table(text = "feat var col 
A  M '#B3E2CD' 
A  F '#E41A1C' 
B  H '#A6CEE3' 
B  M '#FCCDE5' 
B  L '#8DD3C7' 
C  0 '#BC80BD' 
C  1 '#A6CEE3' 
C  3 '#B3E2CD' 
C  4 '#E41A1C'", 
         header = TRUE, stringsAsFactors = FALSE) 

# Load packages 
library(tidyverse) 

# Process the data 
clinDF2 <- clinDF %>% 
    rownames_to_column("feat") %>% 
    gather(Group, var, -feat) %>% 
    left_join(parsingDF, by = c("feat", "var")) %>% 
    select(-var) %>% 
    spread(Group, col) %>% 
    remove_rownames() %>% 
    column_to_rownames("feat") 
+0

würde Sie erraten alles im Rohr umfassen kann Wenn Sie '...%>% verbreiten (Gruppe, Spalte)%>% remove_rownames()%>% column_to_rownames ('feat')' – Sotos

+0

@Sotos Vielen Dank für das Update. Ich werde meine Antwort basierend auf Ihrem Vorschlag bearbeiten. – www

Verwandte Themen