ich eine große Datenmenge haben, aber hier habe ich eine Beispieldaten erschaffe, die gleichen Daten Gerangel Problem hatdplyr | group_by vs anti_join | effizienteste Weg
Daten
brand=c('MS', 'Google', 'Apple', 'MS', 'FB', 'Apple', 'Oracle')
product=c('Window', 'Search', 'Iphone', 'Window', 'Network', 'Iphone', 'DB')
isExist=c('Yes', 'Yes', NA, 'No', NA, 'Yes', NA)
df= data.frame(brand, product, isExist)
sehen diese Daten wie diese
brand product isExist
1 MS Window Yes
2 Google Search Yes
3 Apple Iphone <NA>
4 MS Window No
5 FB Network <NA>
6 Apple Iphone Yes
7 Oracle DB <NA>
jetzt Ich möchte die Zeilen basierend auf Marke und Produkt (zusammengesetzter Schlüssel), die NA-Einträge für isExist und keine anderen Zeilen für den gleichen zusammengesetzten Schlüssel, der Werte hat, dh es sollte FB, Oracle, aber nicht Apple als eine der Zeile (ro w no 6) Wert in isExist
Ich bin es zu erreichen anti_join verwenden, hier der Code
library(dplyr)
testWithData <- df %>% filter(!is.na(isExist))
testWithoutData <- df %>% filter(is.na(isExist))
final <- unique(anti_join(testWithoutData, testWithData, by = c('brand', 'product')))
Ausgabe
brand product isExist
1 FB Network <NA>
2 Oracle DB <NA>
Diese Lösung funktioniert, aber es ist zu viel Zeit in Anspruch nimmt, ich weiß, es ist nicht der effizienteste Weg. Ich fühle mich GROUP_BY und Filter kann etwas Magie tun, aber ich bin nicht sicher, wie ich die Abfrage zu schreiben, kann mir bitte jemand in dieser Hinsicht helfen
ich habe keine Zeit, es gerade jetzt zu arbeiten, aber ich bin ziemlich sicher, es ist eine elegante Lösung mit cumsum (x == 0), nachdem Sie die NA konvertieren zu einem zählbaren Wert (zB 1). Siehe Top Antwort auf meine Frage hier: https://stackoverflow.com/questions/47289543/modify-certain-values-in-a-data-frame-by-indirect-reference-to-the-columns/47310247?noredirect= 1 # comment81573872_47310247 – Stanwood