R 删除重复的行

R 删除重复的行,r,duplicates,r-faq,R,Duplicates,R Faq,我已将CSV文件读入R data.frame。某些行在其中一列中具有相同的元素。我想删除该列中重复的行。例如: platform_external_dbus 202 16 google 1 platform_external_dbus 202 16 space-ghost.verbum 1 platform_external_dbus

我已将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
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)), ]

我只想要这些行中的一行,因为其他行在第一列中有相同的数据。

只需将数据框与所需的列隔离,然后使用唯一的函数: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.

对于来这里寻找重复行删除一般答案的人,请使用!重复:

回答来源:

包中的函数执行任意重复删除,可以从本问题中的特定列/变量中删除,也可以考虑所有列/变量。dplyr是的一部分

数据和包

删除与其他行完全重复的行:

使用sqldf:

输出:

  a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2
data.table包也有自己独特的和重复的方法,还有一些附加功能

unique.data.table和duplicated.data.table方法都有一个附加的by参数,允许您分别传递列名或其位置的字符或整数向量

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 

或者,您可以使用tidyr将cols 4和cols 5中的数据嵌套到一行中:

现在删除第2列和第3列的重复项以进行统计分析,但您已将第4列和第5列的数据保存在一个TIBLE中,并且可以在任何时候使用unnest返回原始数据帧。

一般答案可以是 例如:

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
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)), ]
您还可以使用dplyr的独特功能!它往往比其他选择更有效,特别是如果你有大量的观察

distinct_data <- dplyr::distinct(yourdata)
删除数据帧的重复行

在此数据集中,没有一个重复的行,因此它返回的行数与mydata中的行数相同

基于一个变量删除重复行

.keep_all函数用于保留输出数据框中的所有其他变量

删除基于多个变量的重复行

.keep_all函数用于保留输出数据框中的所有其他变量


from:

这个问题也可以通过从每个组中选择第一行来解决,该组是我们要根据其选择唯一值的列。在共享示例中,它只是第一列

使用基本R:

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

#                      V1  V2 V3     V4 V5
#1 platform_external_dbus 202 16 google  1
在dplyr中

或者使用data.table

如果我们需要基于多个列找出唯一的行,只需将这些列名添加到上述每个答案的分组部分

资料


下面是一个非常简单、快速的dplyr/tidy解决方案:

删除完全相同的行:

删除仅在某些列中相同的行:


你想要哪一个?就第一个?换句话说:你想保留google、localhost还是hughsie?这与我的统计分析无关。我只是想把项目标题第一列、第二列的bug数量和项目第三列的组织数量联系起来。酷。扔掉不必要的列并使用?Uniques这看起来会很好地工作。你能给我解释一下代码的[,1:3]部分发生了什么吗?我不熟悉R,这就是为什么我会问我只能假设是一个明显的问题。@user1897691然后将其标记为正确;如果您喜欢,请检查并注意,这将删除除前三列之外的所有列。我想创建一个新变量,它标记某个变量上是否有重复项,就像df$duplicates@jacob看到这个问题了吗?这将保留第一个出现的值,并删除其余重复项,对吗?或者它随机删除值?@Alphabetagama是的,它保留第一个出现的值如果您只对某些列中的重复项感兴趣,例如cols 1和cols 2,我们可以使用df[!duplicateddf[,1:2]],这会增加设置整个SQL数据库的开销。设置整个SQL数据库是什么意思?这是主要优势之一:“使用sqldf,用户无需执行以下操作,所有操作都会自动完成:数据库设置、编写定义每个表的CREATETABLE语句、导入和导出数据库”。这不是一个最佳的解决方案,但对于熟悉SQL的人来说很方便。使用时要小心-如果没有重复项,这将导致错误,使用df[!duplicateddf,]可能更安全。这与Sam Firke的答案相同,但细节较少。顺便说一句,很好的答案,.keep_全部是关于是否保留所有列,不要与熊猫混养。
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 
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]>
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
distinct_data <- dplyr::distinct(yourdata)
library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe
distinct(mydata)
library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using carb variable
distinct(mydata,carb, .keep_all= TRUE)
library(dplyr)
mydata <- mtcars

# Remove duplicate rows of the dataframe using cyl and vs variables
distinct(mydata, cyl,vs, .keep_all= TRUE)
subset(df, ave(V2, V1, FUN = seq_along) == 1)

#                      V1  V2 V3     V4 V5
#1 platform_external_dbus 202 16 google  1
library(dplyr)
df %>% group_by(V1) %>% slice(1L)
library(data.table)
setDT(df)[, .SD[1L], by = V1]
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))
library(dplyr)
iris %>% 
  distinct(.keep_all = TRUE)
iris %>% 
  distinct(Sepal.Length, Sepal.Width, .keep_all = TRUE)