2016-10-01 5 views
-1

Ich habe einen Datenrahmen:in R Duplikate von Spalte 1 und Filter finden, indem nicht NA Spalte 3

a <- c(rep("A", 3), rep("B", 3), rep("C",2)) 
b <- c(1,1,2,4,1,1,2,2) 
c <- c(1,NA,2,4,NA,1,2,2) 
df <-data.frame(a,b,c) 

Ich habe einen Datenrahmen mit einigen doppelten Variablen in Spalte 1, aber wenn ich die duplizierte Funktion zu verwenden, sie nach dem Zufall mit zweifacher Ausfertigung (Funktion) wählt die Reihe nach Deduplizierung

dedup_df = df[!duplicated(df$a), ] 

Wie kann ich sicherstellen, dass die Ausgabe mir die Zeile zurückgibt, die nicht eine NA auf Spalte c enthält?

Ich versuchte, das dplyr Paket aber die Ausgabe druckt ein Ergebnis

library(dplyr) 
options(dplyr.print_max = Inf) 
df %>%     ## source dataframe 
group_by(a) %>%   ## grouped by variable 
filter(!is.na(c)) %>% ## filter by Gross value 
as.data.frame(dedup_df) 
+0

Es ist nicht klar, was Ihre erwartete Ausgabe ist. Das 'dedup_df' hat keine NA-Zeilen von c – akrun

+0

@akrun, ja deduP_df enthält keine NA, wenn Sie es einmal ausführen, aber es ist nicht sichergestellt, dass dies der Fall ist. Also, was ich in allen Läufen erreichen möchte, dass keine Zeile, die dupliziert wird, würde mit einer NA in dieser Spalte gewählt werden –

+0

In diesem Fall nur tun df%>% filter (! Is.na (c))%>%. ! duplicated (. $ a),] 'oder ein doppelter' filter' dh 'df%>% filter (! is.na (c))%>% filter (! duplicated (a))' – akrun

Antwort

0

Ihre Nutzung von duplicated Funktion nur zu verwenden, um entfernen Sie doppelte Beobachtungen (Zeilen) eine Spalte als Schlüssel von einem Datenrahmen unter Verwendung korrekt ist.

Aber es scheint, dass Sie besorgt sind, dass es eine Zeile, die NA enthält, in einer anderen Spalte behalten und eine andere Zeile, die einen nicht-NA-Wert enthält, fallen lassen kann.

Ich werde Ihnen Beispiel verwenden, aber mit einer leichten Modifikation

a <- c(rep("A", 3), rep("B", 3), rep("C",2)) 
b <- c(1,1,2,4,1,1,2,2) 
c <- c(NA,1,2,4,NA,1,2,2) 
df <-data.frame(a,b,c) 

> df 
    a b c 
1 A 1 NA 
2 A 1 1 
3 A 2 2 
4 B 4 4 
5 B 1 NA 
6 B 1 1 
7 C 2 2 
8 C 2 2 

In diesem Fall Ihre dedup_df enthält für den ersten Wert einer NA.

> dedup_df = df[!duplicated(df$a), ] 
> dedup_df 
    a b c 
1 A 1 NA 
4 B 4 4 
7 C 2 2 

Lösung:

Reorder df säulenchromatographisch c zuerst und dann den gleichen Befehl. Diese Umordnung nach Spalte c sendet alle NAs an das Ende des Datenrahmens. Wenn die duplicated übergibt, werden diese Zeilen mit NA zuletzt angezeigt und sie als TRUE markieren, wenn es eine vorherige ohne NA gab.

df = df[order(df$c),] 
dedup_df = df[!duplicated(df$a), ] 

> dedup_df 
    a b c 
2 A 1 1 
6 B 1 1 
7 C 2 2 

Sie können auch in absteigender Reihenfolge neu ordnen

df = df[order(df$c,decreasing = T),] 
dedup_df = df[!duplicated(df$a), ] 

> dedup_df 
    a b c 
4 B 4 4 
3 A 2 2 
7 C 2 2 
Verwandte Themen