Удаление дублированных строк



Я прочитал CSV файл в R данных.рамка. Некоторые строки имеют один и тот же элемент в одном из столбцов. Я хочу удалить дубликаты строк в этом столбце. Например:



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


Я хотел бы только одну из этих строк, так как другие имеют те же данные в первом столбце.

672   8  

8 ответов:

просто изолируйте свой фрейм данных в нужные вам столбцы, а затем используйте уникальную функцию: 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.

для людей, которые пришли сюда, чтобы найти общий ответ для удаления дубликатов строк, используйте !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

ответ: удаление дублированных строк из R фрейма данных

функции distinct() на dplyr пакет выполняет произвольное удаление дубликатов, позволяя спецификацию дублированных переменных (как в этом вопросе) или учитывая все переменные.

данные:

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

удалить строки, где указанные столбцы дублируются:

library(dplyr)
dat %>% distinct(a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

удалить строки, которые являются полными дубликатами других строк:

dat %>% distinct

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

The data.table пакет также имеет unique и duplicated методы его собственные с некоторыми дополнительными функциями.

и unique.data.table и duplicated.data.table методы имеют дополнительный by аргумент, который позволяет передать character или integer вектор имен столбцов и их расположение соответственно

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

другой важной особенностью этих методов является огромный прирост производительности для больших наборов данных

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 

С 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)

устранение:

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

выход:

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

общий ответ может быть например:

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

выход:

      X1 X2 X3
    1  2  9  6
    2  4  6  7

или вы можете вложить данные в cols 4 и 5 в одну строку с 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 и 3 теперь удалены для статистического анализа, но вы сохранили данные col 4 и 5 в tibble и можете вернуться к исходному фрейму данных в любой момент с unnest().

вы также можете использовать dplyr ' s

Comments

    Ничего не найдено.