2016-04-08 4 views
-1

Ich habe die folgenden Themen gelesen, die ähnlich zu sein scheinen (aber immer noch andere) Fragen mit mir:R Wie Spalten in einer Tabelle nach Spaltenreihenfolge in einer anderen Tabelle zu finden und neu anordnen (Tabellen enthalten Diff Anzahl der Spalten)

  1. Order data frame rows according to a target vector that specifies the desired order
  2. How to reorder data.table columns (without copying)

meine Fragen sind anders, weil in Thread 1 sind die beiden Tabellen gleiche Länge haben, und ich versuchte Methode in Thread angegeben unter Verwendung von 2, aber scheint, wie sie müssen auch gleich sein Länge.

für Illustrationszwecke, werde ich zwei Tabellen erstellen, wie folgend:

table1 = data.frame(rbind(c(rep(c(TRUE,FALSE), 3)), c(rep(TRUE, 4), rep(FALSE, 2)))) 
dim(table1) 
setnames(table1, letters[1:6]) 
table1 
    a  b c  d  e  f 
1 TRUE FALSE TRUE FALSE TRUE FALSE 
2 TRUE TRUE TRUE TRUE FALSE FALSE 

table2 = data.frame(rbind(c(rep(c(TRUE,FALSE), 2)), c(rep(TRUE, 3), rep(FALSE, 1)))) 
dim(table2) 
setnames(table2, letters[7:4]) 
table2 
    g  f e  d 
1 TRUE FALSE TRUE FALSE 
2 TRUE TRUE TRUE FALSE 

die gewünschte Rückkehr wäre:

f  e  d 
1 FALSE TRUE FALSE 
2 FALSE FALSE TRUE 

die Rückgabetabelle die folgenden Kriterien passen:

  1. enthält nur die Buchstaben existieren in beiden Tabellen
  2. Reihenfolge der Rückgabetabelle ist mit der Reihenfolge in der Tabelle konsistent 2

Grundsätzlich Ich möchte meine tabelle1 reinigen nur Spaltennamen enthalten, die auch in table2 existieren, und ich möchte, dass die tabelle1 Spalten neu geordnet werden in der Reihenfolge wie die Spalten in Tabelle 2.

Lassen Sie mich wissen, wenn ich noch etwas klären muss! Vielen Dank!

+1

was ist mit f? 'table1 [intersect (Namen (table2), Namen (table1))]'? Welche Pakete verwendest du? Woher kommt 'setnames'? – rawr

+0

Warum wird Spalte f von der gewünschten Ausgabe ausgeschlossen? – FascinatingFingers

+0

@FascinatingFingers guter Fang! mein Fehler! werde jetzt reparieren mein errow – alwaysaskingquestions

Antwort

0

Installieren und laden Sie dplyr Paket für select Funktion. Andere verwendete Funktionen match, order, is.na, which und Operator %in%.

install.packages("plyr") 
    install.packages("dplyr") 
    library(plyr) 
    library(dplyr) 

    table1 = data.frame(rbind(c(rep(c(TRUE,FALSE), 3)), c(rep(TRUE, 4), rep(FALSE, 2)))) 
    dim(table1) 
    names(table1) <- letters[1:6] 

    table2 = data.frame(rbind(c(rep(c(TRUE,FALSE), 2)), c(rep(TRUE, 3), rep(FALSE, 1)))) 
    dim(table2) 
    names(table2) <- letters[7:4] 

    target <- as.vector(names(table2)) 
    t <- select(table1, which(names(table1) %in% target)) 
    gg <- match (target,names(t)) 
    gg <- gg[!is.na(gg)] 
    Result <- t[,order(gg)] 
    Result 
+0

ah danke Sowmya! Ich habe eine Variante Ihrer Methode verwendet, aber die Grundidee/Schritte sind die gleichen. Danke! – alwaysaskingquestions

+0

Könnten Sie bitte Ihre Version hier einfügen, damit ich auch bitte lernen kann. Vielen Dank. –

+0

Hallo Sowmya, absolut. Ich werde eine Antwort in ein paar Minuten eingeben – alwaysaskingquestions

1

Dank Sowmya für den Austausch von Ideen mit mir. Auf Anfrage, unten ist meine Version der Antwort basierend auf dem, was ich aus Sowmyas Antwort und den Kommentaren von rawr gelernt habe.

table1 = data.frame(rbind(c(rep(c(TRUE,FALSE), 3)), c(rep(TRUE, 4), rep(FALSE, 2)))) 
dim(table1) 
setnames(table1, letters[1:6]) 

table2 = data.frame(rbind(c(rep(c(TRUE,FALSE), 2)), c(rep(TRUE, 3), rep(FALSE, 1)))) 
dim(table2) 
setnames(table2, letters[7:4]) 

# below are my answer 
col2keep = intersect(colnames(table2), colnames(table1)) 
table1_reduce = table1[, (match(col2keep, colnames(table1)))] 

und table1_reduce enthält meine gewünschte Ausgabe.

Verwandte Themen