Entfernen Sie doppelte Zeilen


152

Ich habe eine CSVDatei in einen R-Datenrahmen eingelesen. Einige der Zeilen haben dasselbe Element in einer der Spalten. Ich möchte Zeilen entfernen, die Duplikate in dieser Spalte sind. Beispielsweise:

platform_external_dbus          202           16                     google        1
platform_external_dbus          202           16         space-ghost.verbum        1
platform_external_dbus          202           16                  localhost        1
platform_external_dbus          202           16          users.sourceforge        8
platform_external_dbus          202           16                    hughsie        1

Ich möchte nur eine dieser Zeilen, da die anderen die gleichen Daten in der ersten Spalte haben.


3
welches willst du? nur der erste? mit anderen Worten: willst du behalten googleoder localhostoder hughsie?
Anthony Damico

Für diesen Teil meiner statistischen Analyse spielt es keine Rolle. Ich versuche nur, den Projekttitel (erste Spalte), die Anzahl der Fehler (zweite Spalte) und die Anzahl der Organisationen im Projekt (dritte Spalte) in Beziehung zu setzen.
user1897691

3
cool. Wirf unnötige Säulen raus und benutze? unique
Anthony Damico

Antworten:


186

Isolieren Sie einfach Ihren Datenrahmen auf die Spalten, die Sie benötigen, und verwenden Sie dann die eindeutige Funktion: D.

# in the above example, you only need the first three columns
deduped.data <- unique( yourdata[ , 1:3 ] )
# the fourth column no longer 'distinguishes' them, 
# so they're duplicates and thrown out.

1
Das sieht so aus, als würde es perfekt funktionieren. Können Sie mir bitte erklären, was mit dem [,1:3]Teil dieses Codes passiert ? Ich bin neu in R, weshalb ich frage, was ich nur annehmen kann, ist eine offensichtliche Frage.
user1897691

6
@ user1897691 markieren Sie es dann als richtig;) sehen Sie sich das an und wenn Sie das mögen, überprüfen Sie twotorials.com
Anthony Damico

3
Beachten Sie, dass dadurch alle Spalten außer den drei ersten entfernt werden.
GuillaumeL

186

Verwenden Sie für Personen, die hierher gekommen sind, um nach einer allgemeinen Antwort zum Entfernen doppelter Zeilen zu suchen, Folgendes !duplicated():

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

duplicated(df)
[1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE

> df[duplicated(df), ]
  a b
2 A 1
6 B 1
8 C 2

> df[!duplicated(df), ]
  a b
1 A 1
3 A 2
4 B 4
5 B 1
7 C 2

Antwort von: Entfernen doppelter Zeilen aus dem R-Datenrahmen


Ich möchte eine neue Varibale erstellen, die markiert, wenn ein Duplikat für eine bestimmte Variable vorhanden ist, fast wie df $ duplicates <- ifelse (dieser Zeilenwert in Spalte a == vorheriger Zeilenwert in Spalte a, 1, 0)
jacob


2
Dies behält den zuerst angezeigten Wert bei und entfernt den Rest der Duplikate, richtig? Oder werden zufällig Werte entfernt?
News_is_Selection_Bias

@ Alphabetagamma Ja, es behält den ersten erscheinenden Wert
Mehdi Nellen

2
Wenn Sie nur an Duplikaten in bestimmten Spalten interessiert sind, z. B. Spalten 1 und 2, können wirdf[!duplicated(df[, 1:2])]
qwr

82

Die Funktion distinct()im dplyrPaket führt eine willkürliche Entfernung von Duplikaten durch, entweder aus bestimmten Spalten / Variablen (wie in dieser Frage) oder unter Berücksichtigung aller Spalten / Variablen. dplyrist ein Teil der tidyverse.

Daten und Paket

library(dplyr)
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))

Entfernen Sie in einer bestimmten Spalte (z. B. Spalte a) duplizierte Zeilen.

Beachten Sie, dass .keep_all = TRUEalle Spalten abeibehalten werden , andernfalls wird nur die Spalte beibehalten.

distinct(dat, a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

Entfernen Sie Zeilen, die vollständige Duplikate anderer Zeilen sind:

distinct(dat)

  a b
1 1 A
2 2 B
3 1 C
4 2 D

Eine gute Antwort ist übrigens, .keep_allob alle Spalten beibehalten und nicht gemischt werden sollenkeep in pandas.
Jason Goal

28

Das data.tablePaket hat auch uniqueund duplicatedMethoden die es mit einigen zusätzlichen Features besitzen.

Sowohl die unique.data.tableals auch die duplicated.data.tableMethode haben ein zusätzliches byArgument, mit dem Sie einen characteroder einen integerVektor von Spaltennamen bzw. deren Positionen übergeben können

library(data.table)
DT <- data.table(id = c(1,1,1,2,2,2),
                 val = c(10,20,30,10,20,30))

unique(DT, by = "id")
#    id val
# 1:  1  10
# 2:  2  10

duplicated(DT, by = "id")
# [1] FALSE  TRUE  TRUE FALSE  TRUE  TRUE

Ein weiteres wichtiges Merkmal dieser Methoden ist ein enormer Leistungsgewinn für größere Datenmengen

library(microbenchmark)
library(data.table)
set.seed(123)
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10))
DT <- copy(DF)
setDT(DT)

microbenchmark(unique(DF), unique(DT))
# Unit: microseconds
#       expr       min         lq      mean    median        uq       max neval cld
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18   100   b
# unique(DT)   746.855   776.6145  2201.657   864.932   919.489  55986.88   100  a 


microbenchmark(duplicated(DF), duplicated(DT))
# Unit: microseconds
#           expr       min         lq       mean     median        uq        max neval cld
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170   100   b
# duplicated(DT)   551.982   558.2215   851.0246   639.9795   663.658   5805.243   100  a 

7

Sie können auch mit dplyr‚s - distinct()Funktion! Es ist in der Regel effizienter als alternative Optionen, insbesondere wenn Sie viele Beobachtungen haben.

distinct_data <- dplyr::distinct(yourdata)

1
Dies ist die gleiche Antwort wie die Antwort von Sam Firke, jedoch mit weniger Details.
qwr

6

Die allgemeine Antwort kann zum Beispiel sein:

df <-  data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6))))



new_df <- df[-which(duplicated(df)), ]

Ausgabe:

      X1 X2 X3
    1  2  9  6
    2  4  6  7

1
Seien Sie vorsichtig bei der Verwendung -which. Dies führt zu Fehlern, wenn keine Duplikate vorhanden sind. Die Verwendung ist df[!(duplicated(df)), ]möglicherweise sicherer.
Jason Goal

5

Mit sqldf:

# Example by Mehdi Nellen
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

Lösung:

 library(sqldf)
    sqldf('SELECT DISTINCT * FROM df')

Ausgabe:

  a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2

Dies hat den Aufwand, eine gesamte SQL-Datenbank einzurichten. cran.r-project.org/web/packages/sqldf/index.html
qwr

Was meinen Sie mit dem Einrichten einer gesamten SQL-Datenbank? Dies ist einer der Hauptvorteile: 'Mit sqldf muss der Benutzer nicht die folgenden Schritte ausführen, die alle automatisch ausgeführt werden: Datenbankeinrichtung, Schreiben der Anweisung create table, mit der jede Tabelle definiert wird, Importieren und Exportieren in und aus der Datenbank '. Es ist keine optimale Lösung, aber praktisch für diejenigen, die mit SQL vertraut sind.
mpalanco

3

Oder Sie verschachteln die Daten in den Spalten 4 und 5 in einer einzigen Zeile mit tidyr:

library(tidyr)
df %>% nest(V4:V5)

# A tibble: 1 × 4
#                      V1    V2    V3             data
#                  <fctr> <int> <int>           <list>
#1 platform_external_dbus   202    16 <tibble [5 × 2]>

Die Duplikate für Spalte 2 und 3 werden jetzt zur statistischen Analyse entfernt. Sie haben jedoch die Daten für Spalte 4 und 5 in einem Tabellenbereich gespeichert und können jederzeit mit zum ursprünglichen Datenrahmen zurückkehren unnest().


1

Entfernen Sie doppelte Zeilen eines Datenrahmens

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe
distinct(mydata)

In diesem Dataset gibt es keine einzige doppelte Zeile, sodass dieselbe Anzahl von Zeilen wie in mydata zurückgegeben wird.



Entfernen Sie doppelte Zeilen basierend auf einer Variablen

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using carb variable
distinct(mydata,carb, .keep_all= TRUE)

Die Funktion .keep_all wird verwendet, um alle anderen Variablen im Ausgabedatenrahmen beizubehalten.



Entfernen Sie doppelte Zeilen basierend auf mehreren Variablen

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using cyl and vs variables
distinct(mydata, cyl,vs, .keep_all= TRUE)

Die Funktion .keep_all wird verwendet, um alle anderen Variablen im Ausgabedatenrahmen beizubehalten.

(von: http://www.datasciencemadesimple.com/remove-duplicate-rows-r-using-dplyr-distinct-function/ )


0

Dieses Problem kann auch gelöst werden, indem die erste Zeile aus jeder Gruppe ausgewählt wird, in der die Gruppe die Spalten sind, auf deren Grundlage wir eindeutige Werte auswählen möchten (im gemeinsam genutzten Beispiel ist es nur die erste Spalte).

Verwenden der Basis R:

subset(df, ave(V2, V1, FUN = seq_along) == 1)

#                      V1  V2 V3     V4 V5
#1 platform_external_dbus 202 16 google  1

Im dplyr

library(dplyr)
df %>% group_by(V1) %>% slice(1L)

Oder mit data.table

library(data.table)
setDT(df)[, .SD[1L], by = V1]

Wenn wir eindeutige Zeilen basierend auf mehreren Spalten herausfinden müssen, fügen Sie diese Spaltennamen einfach im Gruppierungsteil für jede der obigen Antworten hinzu.

Daten

df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L), 
.Label = "platform_external_dbus", class = "factor"), 
V2 = c(202L, 202L, 202L, 202L, 202L), V3 = c(16L, 16L, 16L, 
16L, 16L), V4 = structure(c(1L, 4L, 3L, 5L, 2L), .Label = c("google", 
"hughsie", "localhost", "space-ghost.verbum", "users.sourceforge"
), class = "factor"), V5 = c(1L, 1L, 1L, 8L, 1L)), class = "data.frame", 
row.names = c(NA, -5L))

0

Hier ist eine sehr einfache, schnelle dplyr/ tidyLösung:

Entfernen Sie völlig gleiche Zeilen:

library(dplyr)
iris %>% 
  distinct(.keep_all = TRUE)

Entfernen Sie Zeilen, die nur in bestimmten Spalten identisch sind:

iris %>% 
  distinct(Sepal.Length, Sepal.Width, .keep_all = TRUE)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.