2017-11-11 6 views
0

Ich möchte prüfen, ob in einem Datenrahmen ("apx") eine Zeile vorhanden ist, in der ein Eintrag aus der Spalte "AD" in px mit einem Eintrag übereinstimmt in der "AD" -Spalte in einem anderen Datenrahmen ("npx"), AND, wobei der SD-Eintrag von der übereinstimmenden Zeile innerhalb von 13 Einheiten der anderen liegt.Erstellen eines dritten Datenrahmens basierend auf Zeilen in zwei verschiedenen Datenrahmen, die mehreren Selektionskriterien entsprechen

Ich habe mehrere verschiedene Referenzen auf SO überprüft, konnte aber keine Antwort finden, da ich einen dritten Datenrahmen erstellen musste (und andere Gründe).

Meine Arbeits-Studie ist dies ...

 npx <- data.frame(TN = c(111, "Z2", 4, "fox", 34256, 4782, "ZGJU45"), 
       SD=c(100, 200, 100, 600, 500, 115, 455), 
       AD=c("34YY", "37PD", "123M", "235W", "37PD", "123M", "1WW")) 


     apx <- data.frame(TN = c(222, "X34", 5, "bear", 47789, 37281, "VF456"), 
       SD = c(101, 201, 310, 450, 515, 660, 505), 
       AD = c("123M", "23XY", "5S S", "1WW", "27 30R", "14M", "37PD")) 

Hinweis: Die AD-Einträge "123M" "1WW" und "37PD" erscheinen in apx und in npx. Der erste und der dritte erscheinen zweimal in NPX.

Versichern Faktoren sind Zeichen geändert:

 i <- sapply(apx, is.factor) 
     apx[i] <- lapply(apx[i], as.character) 
     i <- sapply(npx, is.factor) 
     npx[i] <- lapply(npx[i], as.character) 

Mein fünfter Versuch ... (Forcierung SD Einträge auf ganze Zahlen) ...

 test5 <- apx[which(apx$AD == npx$AD & 
       as.integer(npx$SD) - as.integer(apx$SD) < 13) 
     %in% as.integer(npx$SD), ] 

Einer meiner früheren Versuche ....

 test3 <- apx[which(apx$AD == npx$AD & 
       as.integer(npx$SD) - as.integer(apx$SD) < 13) 
     %in% setequal(npx$SD, apx$SD), ] 

Was ich suche in einem dritten Datenrahmen ist ....

weil 123M (erste Reihe von apx) in der dritten Reihe von npx gefunden wird und die entsprechenden Einträge für SD innerhalb von 13 Einheiten voneinander sind (100 und 101); Beim zweiten Auftreten von 123M in npx (in Reihe sechs) beträgt der Unterschied zwischen den entsprechenden Einträgen für SD jedoch 15 Einheiten. Eigentlich suche ich nur nach den Instanzen, bei denen der SD-Eintrag in npx < 13 größer ist (nur) als der entsprechende SD-Eintrag in apx.

 [2] bear 450 1WW  

weil 1WW (4. Reihe von APX) in der letzten Reihe der NPX und die entsprechenden Einträge für SD sind innerhalb von 13 Einheiten voneinander (450 und 455) zu finden ist.

 [3] VF456 505 37PD 

Während 37PD (letzte Zeile von APX) in der zweiten Reihe des NPX gefunden wird, geht der Eintrag nicht Qualität 37PD da die entsprechenden SD-Werte von mehr als 13 Einheiten voneinander entfernt sind (200 und 505); Die entsprechenden Einträge von SD für das andere Erscheinungsbild von 37PD in npx (Zeile fünf) liegen jedoch innerhalb von 13 Einheiten voneinander, wodurch 37PD dazu qualifiziert wird, in dem resultierenden Datenrahmen zu erscheinen.

Ich knirsche mit den Zähnen und erwarte von jemandem, dass er mir eine sehr einfache Möglichkeit zeigt, dies zu tun, aber eher diese Peinlichkeit zu erleiden, als mehr Räder zu drehen. Danke im Voraus.

Antwort

1

Wenn ich verstehe, was Sie versuchen, zu tun, denke ich, dass wir die merge und subset Funktionen verwenden können:

merge_df <- merge(npx, apx, by = 'AD', suffixes = c('npx','apx')) 

subset(merge_df, SDnpx - SDapx <= 13 & SDnpx >= SDapx) 

    AD TNnpx SDnpx TNapx SDapx 
3 1WW ZGJU45 455 bear 450 

Aber ich gebe zu, dass ich eigentlich nicht ganz verstehen, was Ihr Zustand Du versuchst zu erzwingen.Wenn wir in Reihen interessiert sind, die eine SD Unterschied haben < = 13, dann können wir folgendes tun:

subset(merge_df, abs(SDnpx - SDapx) <= 13) 

    AD TNnpx SDnpx TNapx SDapx 
1 123M  4 100 222 101 
3 1WW ZGJU45 455 bear 450 
5 37PD 34256 500 VF456 505 

dann die Daten in die endgültige gewünschte Form bekommen (was auch nicht ganz klar ist) ist nur Umbenennen und/oder Löschen von Spalten aus der data.frame.

Verwandte Themen