Çoğaltılan satırları kaldır


152

CSVR data.frame içine bir dosya okudum . Bazı satırlar, sütunlardan birinde aynı öğeye sahiptir. Bu sütunda yinelenen satırları kaldırmak istiyorum. Örneğin:

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

Diğerleri ilk sütunda aynı verilere sahip olduğundan bu satırlardan yalnızca birini istiyorum.


3
hangisini istersin? sadece ilk mi? Başka bir deyişle: tutmak mı googleyoksa localhostveya hughsiemı?
Anthony Damico

İstatistiksel analizimin bu kısmı için önemli değil. Sadece proje başlığı (ilk sütun), hata sayısı (ikinci sütun) ve proje (üçüncü sütun) kuruluşların sayısı ilişkilendirmek çalışıyorum.
user1897691

3
güzel. gereksiz sütunları dışarı atmak ve kullanmak? benzersiz
Anthony Damico

Yanıtlar:


186

veri çerçevenizi ihtiyacınız olan sütunlara ayırın, ardından benzersiz işlevi kullanın: 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
Bu mükemmel bir şekilde çalışacak gibi görünüyor. Lütfen bana [,1:3]bu kodun bir kısmında neler olduğunu açıklayabilir misiniz ? R'de yeniyim, bu yüzden açık bir soru olduğunu varsayabileceğim şeyleri soruyorum.
user1897691

6
@ user1897691 doğru olarak işaretleyin;) Bunu izleyin ve eğer isterseniz, twotorials.com adresini
Anthony

3
Bunun, ilk üç sütun dışındaki tüm sütunları kaldıracağını unutmayın.
GuillaumeL

186

Buraya, yinelenen satır kaldırma için genel bir yanıt aramaya gelen insanlar için şunu kullanın !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

Yanıt kaynağı: Yinelenen satırları R veri çerçevesinden kaldırma


Ben hemen hemen df $ yinelenen <- ifelse (bu sütun a == sütun a, 1, 0 önceki satır değeri) gibi belirli bir değişken üzerinde yinelenen varsa bayraklar yeni bir değişken oluşturmak istiyorum
jacob


2
Bu, ortaya çıkan ilk değeri korur ve diğer kopyaları kaldırır, değil mi? Yoksa değerleri rastgele kaldırır mı?
0'da

@alphabetagamma evet, ilk ortaya çıkan değeri
koruyor

2
Sadece belirli sütunlardaki kopyalarla ilgileniyorsanız, diyelim 1 ve 2 numaralı sütunlar,df[!duplicated(df[, 1:2])]
qwr

82

Fonksiyon distinct()olarak dplyrpaket gerçekleştirir ya belirli sütunlarından / değişkenler (bu söz konusu olduğu gibi) ya da her sütun / değişkenler göz önüne alınarak, yinelenen kaldırılmasını keyfi. dplyrbir parçasıdır tidyverse.

Veri ve paket

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

Belirli bir sütunda çoğaltılmış satırları kaldırma (ör. Sütun a)

.keep_all = TRUETüm sütunları koruduğunu unutmayın , aksi takdirde yalnızca sütun akorunur.

distinct(dat, a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

Diğer satırların tam kopyası olan satırları kaldırın:

distinct(dat)

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

Güzel cevap, bu arada, .keep_alltüm sütunları tutmak için değil, karıştırılabilir edip içindir keepde pandas.
Jason Goal

28

data.tablePaket ayrıca vardır uniqueve duplicatedbunun yöntemleri bazı ek özelliklere sahip kendi oluyor.

Hem unique.data.tableve duplicated.data.tableyöntemlerinde, sırasıyla sütun adlarının veya konumlarının bybir characterveya integervektörünü geçirmenize olanak tanıyan ek bir bağımsız değişken vardır.

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

Bu yöntemlerin bir başka önemli özelliği, daha büyük veri kümeleri için büyük bir performans kazancıdır

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

Ayrıca kullanabilirsiniz dplyr'ın distinct()işlevini! Özellikle çok fazla gözleminiz varsa alternatif seçeneklerden daha verimli olma eğilimindedir.

distinct_data <- dplyr::distinct(yourdata)

1
Bu, Sam Firke'nin cevabı ile aynı cevaptır, ancak daha az ayrıntıyla.
qwr

6

genel cevap örneğin olabilir:

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)), ]

çıktı:

      X1 X2 X3
    1  2  9  6
    2  4  6  7

1
Kullanırken dikkatli olun -which, kopya yoksa bu hataya yol açar, kullanım df[!(duplicated(df)), ]daha güvenli olabilir.
Jason Goal

5

İle 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)

Çözüm:

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

Çıktı:

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

Bu, tüm bir SQL veritabanını kurma yüküne sahiptir. cran.r-project.org/web/packages/sqldf/index.html
qwr

Tüm bir SQL veritabanını kurarak ne demek istiyorsun? Bu temel avantajlardan biridir: 'sqldf ile kullanıcı aşağıdakileri yapmaktan kurtulur, bunların tümü otomatik olarak yapılır: veritabanı kurulumu, her tabloyu tanımlayan tablo oluşturma ifadesini yazma, veritabanına ve veritabanından dışa aktarma '. Optimal bir çözüm değildir, ancak SQL'e aşina olanlar için kullanışlıdır.
mpalanco

3

Veya 4 ve 5 numaralı sütunlardaki verileri aşağıdakilerle tek bir satıra yerleştirebilirsiniz 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]>

Col 2 ve 3 kopyaları artık istatistiksel analiz için kaldırıldı, ancak col 4 ve 5 verilerini bir tibble içinde tuttunuz ve herhangi bir noktada orijinal veri çerçevesine geri dönebilirsiniz unnest().


1

Bir veri çerçevesinin yinelenen satırlarını kaldırma

library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe
distinct(mydata)

Bu veri kümesinde, tek bir yinelenen satır yoktur, bu nedenle verilerimdekiyle aynı sayıda satır döndürdü.



Tek bir değişkene dayalı Yinelenen Satırları Kaldırma

library(dplyr)
mydata <- mtcars

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

.Keep_all işlevi çıktı verisi çerçevesindeki diğer tüm değişkenleri korumak için kullanılır.



Birden çok değişkeni temel alan Yinelenen Satırları Kaldırma

library(dplyr)
mydata <- mtcars

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

.Keep_all işlevi çıktı verisi çerçevesindeki diğer tüm değişkenleri korumak için kullanılır.

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


0

Bu sorun, grubun benzersiz değerler seçmek istediğimiz sütunlar olduğu her gruptan ilk satırı seçerek de çözülebilir (paylaşılan örnekte sadece 1. sütundur).

R tabanını kullanarak:

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

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

İçinde dplyr

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

Veya kullanarak data.table

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

Birden çok sütuna dayanan benzersiz satırlar bulmamız gerekirse, yukarıdaki sütunların her biri için bu sütun adlarını gruplama bölümüne ekleyin.

veri

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

İşte çok basit, hızlı dplyr/ tidyçözüm:

Tamamen aynı olan satırları kaldırın:

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

Yalnızca belirli sütunlarda aynı olan satırları kaldırın:

iris %>% 
  distinct(Sepal.Length, Sepal.Width, .keep_all = TRUE)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.