Удаление дублированных строк
Я прочитал файл CSV
в файле R. data.frame. Некоторые строки имеют один и тот же элемент в одном из столбцов. Я хотел бы удалить строки, которые являются дубликатами в этом столбце. Например:
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
Я хотел бы только одну из этих строк, так как остальные имеют одни и те же данные в первом столбце.
Ответы
Ответ 1
просто выделите свой кадр данных в нужные столбцы, затем используйте уникальную функцию: 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.
Ответ 2
Для тех, кто пришел сюда, чтобы найти общий ответ для удаления дубликатов строк, используйте !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
Ответ 3
Функция 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
Ответ 4
Пакет 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
Ответ 5
общий ответ может быть
например:
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
Ответ 6
Вы также можете использовать функцию dplyr
distinct()
! Это имеет тенденцию быть более эффективным, чем альтернативные варианты, особенно если у вас есть множество наблюдений.
distinct_data <- dplyr::distinct(yourdata)
Ответ 7
С 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
Ответ 8
Или вы можете вложить данные в столбцах 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 в виде полутонов и можете вернуться к исходному кадру данных в любой точке с помощью unnest()
.
Ответ 9
Удалить повторяющиеся строки кадра данных
library(dplyr)
mydata <- mtcars
# Remove duplicate rows of the dataframe
distinct(mydata)
В этом наборе данных нет ни одной повторяющейся строки, поэтому он возвратил то же количество строк, что и в mydata.
Удалить повторяющиеся строки на основе одной переменной
library(dplyr)
mydata <- mtcars
# Remove duplicate rows of the dataframe using carb variable
distinct(mydata,carb, .keep_all= TRUE)
Функция .keep_all используется для сохранения всех других переменных в кадре выходных данных.
Удалить повторяющиеся строки на основе нескольких переменных
library(dplyr)
mydata <- mtcars
# Remove duplicate rows of the dataframe using cyl and vs variables
distinct(mydata, cyl,vs, .keep_all= TRUE)
Функция .keep_all используется для сохранения всех других переменных в кадре выходных данных.
(от: http://www.datasciencemadesimple.com/remove-duplicate-rows-r-using-dplyr-distinct-function/)