wake-up-neo.com

Löschen Sie Zeilen basierend auf mehreren Bedingungen mit dplyr

Ich versuche, bestimmte Zeilen in meinem Datensatz basierend auf Werten in mehreren Spalten zu löschen. Eine Zeile sollte nur gelöscht werden, wenn eine Bedingung in allen 3 Spalten erfüllt ist. 

Das ist mein Code:

test_dff %>%
  filter(contbr_nm != c('GAITHER, BARBARA', 'PANIC, RADIVOJE', 'KHAN, RAMYA') & 
           contbr_city != c('APO AE', 'PORSGRUNN', 'NEW YORK') &
           contbr_Zip != c('9309', '3924', '2586'))

Dieser Code sollte 12 Zeilen in meiner Tabelle entfernen. Stattdessen wird eine große Mehrheit von ihnen entfernt. Ich vermute, dass es alle möglichen Zeilen entfernt, wenn eine der Bedingungen erfüllt ist. 

Gibt es eine bessere Lösung oder muss ich den Ansatz verwenden, der hier beschrieben wird?

Muss ich jede Kombination einzeln angeben? So wie? Dieser Ansatz löscht auch viel zu viele Zeilen und ist daher auch falsch.

test_dff %>%
  filter((contbr_nm != 'GAITHER, BARBARA' & contbr_city != 'APO AE' & contbr_Zip != '9309') &
         (contbr_nm != 'PANIC, RADIVOJE' & contbr_city != 'PORSGRUNN' & contbr_Zip != '3924') &
           (contbr_nm != 'KHAN, RAMYA' & contbr_city != 'NEW YORK' & contbr_Zip != '2586') )

Wenn ich mich darauf konzentriere, Zeilen nur basierend auf einer Variablen zu löschen, funktioniert dieser Code:

test_dff %>%
  filter(contbr_Zip != c('9309')) %>%
  filter(contbr_Zip != c('3924')) %>%
  filter(contbr_Zip != c('2586'))

Warum funktioniert ein solcher Ansatz nicht?

test_dff %>%
  filter(contbr_Zip != c('9309','3924','2586')) 

Vielen dank für Deine Hilfe.

3
Trgovec

Hier ist ein Ansatz, der auf Verknüpfungen basiert - alle Elemente müssen exakt übereinstimmen.

main <- read.csv(text = "
id,name,city,Zip
1,mary,new york,10017
2,jonah,new york,10016
3,tamil,manhattan,10019
4,vijay,harlem,10028
")

excludes <- read.csv(text = "
name,city,Zip
jonah,new york,10016
vijay,harlem,10028
")

library(dplyr)
anti_join(main, excludes)

#   id  name      city   Zip
# 1  3 tamil manhattan 10019
# 2  1  mary  new york 10017
3
Andrew Lavers

Anpassen Ihrer zweiten Frage (nicht getestet)

test_dff %>%
  filter(!((contbr_nm == 'GAITHER, BARBARA' & contbr_city == 'APO AE' & contbr_Zip == '9309') |
           (contbr_nm == 'PANIC, RADIVOJE' & contbr_city == 'PORSGRUNN' & contbr_Zip == '3924') |
           (contbr_nm == 'KHAN, RAMYA' & contbr_city == 'NEW YORK' & contbr_Zip == '2586') ))
3
Andrew Lavers

Hier ist ein Ansatz, bei dem eine neue Variable erstellt wird, indem die Werte in den mehreren Spalten, auf die Sie verweisen möchten, mit Ihrem Filter verknüpft werden:

set.seed(15)
dfTest <- data.frame(matrix(round(rnorm(20),3), nrow=10))
dfTest$tempcol <- paste(dfTest$X1,dfTest$X2)

head(dfTest)
      X1     X2       tempcol
1  0.259  0.855   0.259 0.855
2  1.831 -0.365  1.831 -0.365
3 -0.340  0.166   -0.34 0.166
4  0.897 -1.243  0.897 -1.243
5  0.488  1.459   0.488 1.459
6 -1.255 -0.004 -1.255 -0.004

#Now remove the values by filtering on tempcol
dfTest %>%
  filter(tempcol != '0.259 0.855') %>%
  select(1:2) #omit tempcol in output

      X1     X2
1  1.831 -0.365
2 -0.340  0.166
3  0.897 -1.243
4  0.488  1.459
5 -1.255 -0.004
6  0.023 -0.021
7  1.091  0.032
8 -0.132 -1.167
9 -1.075 -0.520
0
Chris K