55 Stimmen

Doppelte Zeilen (basierend auf 2 Spalten) in Data Frame in R finden

Ich habe einen Datenrahmen in R, der wie folgt aussieht:

| RIC    | Date                | Open   |
|--------|---------------------|--------|
| S1A.PA | 2011-06-30 20:00:00 | 23.7   |
| ABC.PA | 2011-07-03 20:00:00 | 24.31  |
| EFG.PA | 2011-07-04 20:00:00 | 24.495 |
| S1A.PA | 2011-07-05 20:00:00 | 24.23  |

Ich möchte wissen, ob es irgendwelche Duplikate in Bezug auf die Kombination von RIC und Datum gibt. Gibt es dafür eine Funktion in R?

81voto

joran Punkte 163857

Sie können versuchen, der Funktion einfach die ersten beiden Spalten zu übergeben duplicated :

duplicated(dat[,1:2])

vorausgesetzt, Ihr Datenrahmen heißt dat . Weitere Informationen finden Sie in den Hilfedateien für das Programm duplicated Funktion durch Eingabe von ?duplicated an der Konsole. Sie erhalten dann die folgenden Sätze:

Ermittelt, welche Elemente eines Vektors oder Datenrahmens Duplikate von Elementen mit kleineren Indizes sind, zurück, der angibt, welche Elemente (Zeilen) Duplikate sind.

Also duplicated gibt einen logischen Vektor zurück, den wir dann verwenden können, um eine Teilmenge von dat :

ind <- duplicated(dat[,1:2])
dat[ind,]

oder Sie können den separaten Zuweisungsschritt überspringen und einfach verwenden:

dat[duplicated(dat[,1:2]),]

28voto

Guy Manova Punkte 436

Dplyr ist so viel besser für diese Art von Dingen geeignet:

library(dplyr)
yourDataFrame %>%
    distinct(RIC, Date, .keep_all = TRUE)

(das ".keep_all" ist optional. wenn es nicht verwendet wird, werden nur die abgeleiteten 2 Spalten zurückgegeben. wenn es verwendet wird, wird der gesamte abgeleitete Datenrahmen zurückgegeben)

21voto

sbha Punkte 8288

Hier ist ein dplyr Option für die Kennzeichnung von Duplikaten auf der Grundlage von zwei (oder mehr) Spalten. In diesem Fall ric y date :

df <- data_frame(ric = c('S1A.PA', 'ABC.PA', 'EFG.PA', 'S1A.PA', 'ABC.PA', 'EFG.PA'),
                 date = c('2011-06-30 20:00:00', '2011-07-03 20:00:00', '2011-07-04 20:00:00', '2011-07-05 20:00:00', '2011-07-03 20:00:00', '2011-07-04 20:00:00'),
                 open = c(23.7, 24.31, 24.495, 24.23, 24.31, 24.495))

df %>% 
  group_by(ric, date) %>% 
  mutate(dupe = n()>1)
# A tibble: 6 x 4
# Groups:   ric, date [4]
  ric    date                 open dupe 
  <chr>  <chr>               <dbl> <lgl>
1 S1A.PA 2011-06-30 20:00:00  23.7 FALSE
2 ABC.PA 2011-07-03 20:00:00  24.3 TRUE 
3 EFG.PA 2011-07-04 20:00:00  24.5 TRUE 
4 S1A.PA 2011-07-05 20:00:00  24.2 FALSE
5 ABC.PA 2011-07-03 20:00:00  24.3 TRUE 
6 EFG.PA 2011-07-04 20:00:00  24.5 TRUE

10voto

Brandon Punkte 1499

Eine einfache Möglichkeit, die gewünschten Informationen zu erhalten, ist die Verwendung von dplyr .

yourDF %>% 
  group_by(RIC, Date) %>% 
  mutate(num_dups = n(), 
         dup_id = row_number()) %>% 
  ungroup() %>% 
  mutate(is_duplicated = dup_id > 1)

Damit:

  • num_dups gibt an, wie oft eine bestimmte Kombination dupliziert wird
  • dup_id gibt an, um welche Doppelnummer es sich bei der jeweiligen Zeile handelt (z. B. 1., 2. oder 3. usw.)
  • is_duplicated gibt Ihnen eine einfache Bedingung, nach der Sie später filtern können, um alle doppelten Zeilen zu entfernen (z. B. filter(!is_duplicated) ), Sie könnten aber auch dup_id für diese (z.B. filter(dup_id == 1) )

4voto

Saurabh Jain Punkte 1448

Wenn Sie doppelte Datensätze basierend auf den Werten der Spalten entfernen möchten Datum y Staat en Datensatz data.frame:

#Indexes of the duplicate rows that will be removed: 
duplicate_indexes <- which(duplicated(dataset[c('Date', 'State')]),) 
duplicate_indexes 

#new_uniq will contain unique dataset without the duplicates. 
new_uniq <- dataset[!duplicated(dataset[c('Date', 'State')]),] 
View(new_uniq)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X