Ich möchte Zeilen löschen, in denen Spalte a doppelte Werte enthält, basierend auf der Anzahl der NAs in anderen Spalten. Dies ist ähnlich, aber ich kann die zählenden NAs nicht dazu bringen, mit den dortigen Lösungen zu arbeiten.
Hier ist mein Spielzeugdatensatz:
df1 <- data.frame(a = c("x","y","y","z","x", "z"), b = c(1,2,NA,4,8,3), c = c(NA,2,2,NA,NA,4), d= c(1:4,NA,NA))
was gibt:
a b c d
1 x 1 NA 1
2 y 2 2 2
3 y NA 2 3
4 z 4 NA 4
5 x 8 NA NA
6 z 3 4 NA
Ich möchte nur Zeilen mit eindeutigen Werten in Spalte a behalten und nur die Zeilen mit der geringsten Anzahl von NAs in den Spalten b & c (ohne NAs in Spalte d).
Dies ist der Code, den ich mir ausgedacht habe:
df1 %>%
mutate(NAs= apply(is.na(cbind(b,c)), 1, sum)) %>%
group_by(a) %>%
top_n(n=1, -NAs)
Mein Problem ist, dass top_n mehr als eine Zeile zurückgibt, wenn es ein Unentschieden gibt. Im Falle eines Unentschieden möchte ich nur, dass die erste Reihe zurückgegeben wird. Und es gibt wahrscheinlich einen besseren Weg, um mutierte Spalten auszuwählen als cbind. Ich brauche auch nicht die "NAs" -Variable, die ich mit mutate erstellt habe. Meine gewünschte Ausgabe ist folgende:
a b c d
x 1 NA 1
y 2 2 2
z 3 4 NA
@markus schlug vor, dass dies auch eine Antwort sein könnte. Vielleicht ist es wahr, da es hilfreich sein kann, den Code im Falle von kurz zu halten dplyr
, da Sie sonst oft recht ausführliche Skripte erhalten.
Der Hauptteil meiner Meinung nach ist jedoch, rowSums
wie bereits erwähnt.
df1 %>%
arrange(a, rowSums(is.na(.[, c("b", "c")]))) %>%
distinct(a, .keep_all = TRUE)
a b c d
1 x 1 NA 1
2 y 2 2 2
3 z 3 4 NA
PS Wenn die Geschwindigkeit ist Ihre Sorge, dann in der Tat würde ich versuchen , so wenig zu verwenden dplyr
Verben wie möglich, wie zum Beispiel des Ansatz mit nur arrange
& distinct
ist 3x schneller als andere Ansätze mit group
, slice
, top_n
, filter
etc.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen