2016-05-13 7 views
1

Ich suche, wie Zeilen in R ausgewählt werden, die in zwei Spalten teilweise übereinstimmen oder nicht übereinstimmen. Meine Daten-Set (als Beispiel) sieht wie folgt aus:Auswählen von Zeilen mit partieller Übereinstimmung/Nichtübereinstimmung in 2 Spalten

df = data.frame(plot1 = c("ABX_15", "BHE_05", "ABX_15"), 
       plot2 = c("AB6_15", "JKS_05", "JKS_05"), 
       value = c(0.4, 0.45, 0.34)) 

Ich will nur „abgestimmt“ Paare von plot1 und plot2 für _05 und _15 enthält Untergruppen erstellen. Das wäre also entweder die erste Zeile oder die zweite Zeile im Beispiel. Ich muss auch nur die Zeilen auswählen, die in plot1 und plot2 eine falsche Übereinstimmung haben, das wäre Zeile Nummer drei. Match ein Missmatch bezieht sich nur auf den zweiten Teil des Plot-Namens.

Ich habe Lösungen für die teilweise Auswahl und für die Auswahl bestimmter Zeilen nach Spalten gefunden, aber ich konnte beides nicht kombinieren.

Ich erwarte 3 Teilmengen des Datensatzes: Eins mit übereinstimmenden _05 anderen mit übereinstimmenden _15 und eins mit missmatches.

+0

Was wird erwartet? – mtoto

+0

Ich erwarte 3 Teilmengen des Datasets: Eins mit passendem _05 ein anderes mit passendem _15 und eins mit missmatches –

+0

@NR Bitte keine zusätzlichen Informationen in den Kommentaren posten, bitte benutze den [edit link] (http://stackoverflow.com/posts/37206518/bearbeiten) nächstes Mal, um deine Frage zu aktualisieren. – Jaap

Antwort

1

andere Lösung sub verwendet alles abzustreifen, bevor der Unterstrich aus den beiden Variablen (einschließlich) und Vergleichen Sie dann diese sub Anweisungen mit ==, um einen logischen Indexvektor zu erstellen:

idx <- sub('.*\\_', '', df$plot1) == sub('.*\\_', '', df$plot2) 

Jetzt können Sie Teilmenge df mit diesem Vektor. df[idx,] gibt:

plot1 plot2 value 
1 ABX_15 AB6_15 0.40 
2 BHE_05 JKS_05 0.45 

die Nichtübereinstimmungen zu erhalten, Sie df[!idx,] verwenden können:

plot1 plot2 value 
3 ABX_15 JKS_05 0.34 

Per die Aktualisierung Ihrer Anforderungen, Sie Indizes für die Anpassung auf 15 oder 05 wie folgt erstellen:

idx15 <- sub('.*\\_', '', df$plot1) == '15' & sub('.*\\_', '', df$plot2) == '15' 
idx05 <- sub('.*\\_', '', df$plot1) == '05' & sub('.*\\_', '', df$plot2) == '05' 

T Dies kann dann zur Untermenge df wie oben gezeigt verwendet werden (z.B. df[idx15,]). Um die Mismatches zu erhalten: df[!idx05 & !idx15,] (oder verwenden Sie die Methode von oben).

+0

Thak ist für Ihr Update - Ich habe gerade die Frage des Kommentars beantwortet. Die Anpassung Ihrer Lösung war kein Problem. Ich habe es etwas anders gemacht, aber es scheint auch zu funktionieren: 'id05 <- sub ('. * \\ _ 05', '', df $ plot1) == sub ('. * \\ _ 05', '', df $ plot2) '. Trotzdem danke! –

0

Fist verschüttet die Namen durch das Muster _. Ich verwende hier die Funktion str_split aus dem stringr Paket. Das Ergebnis ist eine Liste. Sie können jetzt den zweiten Teil des Namens extrahieren. Nach Entadressierung Sie das Ergebnis Ihres Datenrahmen df hinzufügen:

df$p1 <- unlist(lapply(str_split(df$plot1, "_"), "[", 2)) 
df$p2 <- unlist(lapply(str_split(df$plot2, "_"), "[", 2)) 

Für eine Basis R-Lösung können Sie strspilt Funktion stattdessen verwenden. Beachten Sie, dass Sie einen Zeichenvektor daraus machen müssen.

unlist(lapply(strsplit(as.character(df$plot1), "_"), "[", 2)) 

und das Ergebnis:

df[df$p1 == df$p2, ] 
    plot1 plot2 value p1 p2 
1 ABX_15 AB6_15 0.40 15 15 
2 BHE_05 JKS_05 0.45 05 05 

Für das Mismatch Verwendung:

df[df$p1 != df$p2, ] 
    plot1 plot2 value p1 p2 
3 ABX_15 JKS_05 0.34 05 15