Удаление дублированных строк
Я прочитал 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
Я хотел бы только одну из этих строк, так как другие имеют те же данные в первом столбце.
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
функции
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().
Comments