删除重复的行
我已经读取一个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
我只想要其中的一行,因为其他行在第一列中有相同的数据。
把你的数据框隔离到你需要的列,然后使用独特的function: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), ] ab 2 A 1 6 B 1 8 C 2 > df[!duplicated(df), ] ab 1 A 1 3 A 2 4 B 4 5 B 1 7 C 2
回答: 从R数据框中删除重复的行
dplyr包中的函数distinct()
执行任意的重复删除,允许指定重复的variables(如在这个问题中)或考虑所有的variables。
数据:
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))
删除指定列被复制的行:
library(dplyr) dat %>% distinct(a, .keep_all = TRUE) ab 1 1 A 2 2 B
删除与其他行完全重复的行:
dat %>% distinct ab 1 1 A 2 2 B 3 1 C 4 2 D
data.table
包也有其自己的unique
和duplicated
方法,有一些额外的function。
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')
输出:
ab 1 A 1 2 A 2 3 B 4 4 B 1 5 C 2
或者你可以将数据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]>
第2列和第3列重复项目现在被移除以便进行统计分析,但是您仍然将第4列和第5列数据保留在一个粗略的位置,并且可以在unnest()
任何位置返回原始数据框架。