2017-09-14 7 views
0

Ich habe einen Datenrahmen, data, bestehend aus:Zeilen filtern mit% in%?

Name   House Street Apt City Postal Phone 
BARRY GORDON 106 SOME DR  A PLACE Z4K4N2 999-828-7555 
ANDERSON TAM 110 SOME DR  A PLACE Z4K4N2 999-542-7555 
BUCKLE J L S 117 SOME DR  A PLACE Z4K4N2 999-212-7555 

Ich habe eine andere Datenrahmen, dnc, in von read_excel lesen:

Last Name Address # Street Name 
Anderson     Some Dr 
Cibrian  PO   Box 
Pistell  PO   Box 

ich alle Zeilen ausschließen möchten, die dnc[,1] und data$Street Spiel und derselbe Straßenname in Daten. Also würde 'Anderson' in data$Name und 'Some' in data$Street diese Zeile löschen. Beachten Sie den Unterschied in Großbuchstaben in beiden dfs. Ich habe manuell/hardcode getestet und konnte immer noch nicht bekommen, was ich wollte. Ich habe versucht:

library(dplyr) 
filter(data, dnc[,1] %in% data$Name & dnc[,3] %in% data$Street) 

und

avector <- as.vector(dnc[,1]) 
data[data$Name %in% avector, ] 

typeof(data$Name) 
[1] "character" 

Dank

+0

es in der Regel eine schlechte Praxis ist auf die Spalten durch ihre Anzahl zu beziehen - auf lange Sicht, die Spalten verschieben um kann zu Problemen führen, die nur schwer zu erkennen. Der Code wird auch viel einfacher, wenn Sie die Spaltennamen verwenden. – MichaelChirico

Antwort

3

Können Sie, wenn diese Arbeit testen:

library(dplyr) 

# Modify entries 
data$NameMod <- tolower(gsub(" .*", "", data$Name)) 
data$StrMod <- tolower(data$Street) 
dnc$`Last Name` <- tolower(dnc$`Last Name`) 
dnc$`Street Name` <- tolower(dnc$`Street Name`) 

# Filter data using dplyr 
filter(data, !NameMod %in% dnc$`Last Name` & 
      StrMod %in% dnc$`Street Name`) 

Ergebnis mit @ycw dataset:

  Name House Street Apt City Postal  Phone NameMod StrMod 
1 BARRY GORDON 106 SOME DR A PLACE Z4K4N2 999-828-7555 barry some dr 
2 BUCKLE J L S 117 SOME DR A PLACE Z4K4N2 999-212-7555 buckle some dr 

Ich kann die von Ihnen bereitgestellten Daten nicht verwenden, um sie blind zu schreiben. Zuerst müssen Sie Ihre Daten ändern (z. B. Text entfernen, der nach Anderson geht und alles in Kleinbuchstaben umwandelt) und dann nach Einträgen in dnc filtern.

+0

Fehler in gsub (". *", Data $ Name): Argument "x" fehlt, ohne Standardwert. Ich bin nicht ganz sicher, was Sie wollten mit dem oder ID beheben es – user136508

+0

@ sn0mmis behoben. – PoGibas

+1

@PoGibas Sie können meinen Code verwenden, um die Daten zu laden und Ihren Code zu testen. Ich denke "Filter (Daten,! (NameMod% in% Dnc $' Nachname '& StrMod% in% Dnc $ Adresse)) "ist die richtige. – www

2

Ich denke, Sie brauchen regulären Ausdruck, um passende Zeichenfolge statt %in% zu finden.

Das folgende Beispiel zeigt das grepl und das dplyr-Paket.

library(dplyr) 

data %>% 
    filter(!(grepl(paste0(unique(dnc$`Last Name`), collapse = "|"), Name, ignore.case = TRUE) & 
      grepl(paste0(unique(dnc$Address), collapse = "|"), Street, ignore.case = TRUE))) 
      Name House Street Apt City Postal  Phone 
1 BARRY GORDON 106 SOME DR A PLACE Z4K4N2 999-828-7555 
2 BUCKLE J L S 117 SOME DR A PLACE Z4K4N2 999-212-7555 

paste0(..., collapse = "|") erzeugt ein Muster für reguläre Ausdrücke, die Elemente mit OR testen. ignore.case = TRUE lässt die Übereinstimmung die Unterschiede in Fällen ignorieren. & bedeutet zwei grepl Bedingung muss beide erfüllt sein. ! zeigt die entgegengesetzte Bedingung an.

DATA

library(dplyr) 

data <- read.table(text = "Name   House Street Apt City Postal Phone 
'BARRY GORDON' 106 'SOME DR'  A PLACE Z4K4N2 999-828-7555 
        'ANDERSON TAM' 110 'SOME DR'  A PLACE Z4K4N2 999-542-7555 
        'BUCKLE J L S' 117 'SOME DR'  A PLACE Z4K4N2 999-212-7555", 
        header = TRUE, stringsAsFactors = FALSE) 

dnc <- read.table(text = "'Last Name' Address 
Anderson     'Some Dr' 
Cibrian  'PO   Box' 
Pistell  'PO   Box'", 
        header = TRUE, stringsAsFactors = FALSE) 

dnc <- dnc %>% rename(`Last Name` = Last.Name) 
+0

schließen können. Es scheint zu viele Zeilen herausgenommen zu haben, als ich eincheckte. Excel – user136508

+0

Es funktioniert für das von Ihnen bereitgestellte Beispiel. Ihre realen Daten müssen also anders sein als das Beispiel, das Sie angegeben haben. – www

+0

Ja, ich versuche es jetzt herauszufinden. Danke für die Antworten ycw. – user136508

Verwandte Themen