2016-07-24 10 views
0

Ich habe ein data.frame, das Benutzerinformationen enthält, aber jede Benutzer-ID kann doppelte Zeilen enthalten, mit einigen fehlenden Daten in verschiedenen Variablen. Was ich versuche zu tun ist, doppelte Benutzerdaten zu entfernen, aber für jeden Benutzer möchte ich die Zeile, die am wenigsten fehlende Werte in der Zeile enthält, um so viel wie Informationen des Benutzers wie möglich zu behalten. Hier ist ein Beispiel für Code zum Erstellen des Demo-Datenrahmens. Jede Hilfe wird besonders geschätzt, wenn sie über das "dplyr" -Paket durchgeführt wird.R Zeilen mit mindestens nas für doppelte Zeilen behalten

User_Table <- data.frame(User_ID =rep(c("UserA","UserB","UserC"),each=3), 
        VariableA= rep(c(1,NA,2),each=3), 
        VariableB = rep(c("TypeA","TypeB",NA),each=3), 
        VariableC = rep(c(NA,2,3),each=3)) 

User_Table[c(1,2,4,5,6,7),3] <- NA 
+0

Für User_ID "B" und „C "Es gibt mehrere Fälle, in denen die Zeilen ha ve Mindest-NA. Möchten Sie den ersten Fall oder alle diese Zeilen auswählen? – akrun

Antwort

1

Wir können versuchen, mit data.table

library(data.table) 
setDT(User_Table)[User_Table[, .I[which.min(Reduce(`+`, 
      lapply(.SD, is.na)))], User_ID]$V1] 
# User_ID VariableA VariableB VariableC 
#1: UserA   1  TypeA  NA 
#2: UserB  NA  NA   2 
#3: UserC   2  NA   3 
0

Dies ist ein Ansatz mit dplyr:

User_Table %>% 
    arrange(rowSums(is.na(.))) %>%  # sort rows by number of NAs 
    distinct(User_ID, .keep_all = TRUE) # keep first row per User_ID only 

Das Ergebnis:

User_ID VariableA VariableB VariableC 
1 UserA   1  TypeA  NA 
2 UserC   2  <NA>   3 
3 UserB  NA  <NA>   2 
+0

Hallo Sven, danke für die schnelle Antwort. Weil ich mit dplyr vertraut bin, kann ich die Logik hinter Ihrem Code leicht verstehen. Nur eine weitere Frage, was bedeuten die Punkte in is.na (.) Und .keep_all? Danke nochmal –

+0

@FelixZhao Das '.' repräsentiert den Datenrahmen' User_Table'. Für den Operator "%>%" steht das '.' immer für das linke Argument. Das Argument '.keep_all = TRUE' in' distinct' ist notwendig, um * alle * Spalten auszuwählen. –

+0

Danke für deine Erklärung, das hilft sehr, Sven –