首页 文章

删除重复的行

提问于
浏览
109

我已经将 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

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

8 回答

  • 148

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

    对于来这里寻找重复行删除的一般答案的人,请使用 !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
    

    回答来自:Removing duplicated rows from R data frame

  • 5

    dplyr包中的函数 distinct() 执行任意重复删除,允许指定重复变量(如本问题中所述)或考虑所有变量 .

    Data:

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

    Remove rows where specified columns are duplicated:

    library(dplyr)
    dat %>% distinct(a, .keep_all = TRUE)
    
      a b
    1 1 A
    2 2 B
    

    Remove rows that are complete duplicates of other rows:

    dat %>% distinct
    
      a b
    1 1 A
    2 2 B
    3 1 C
    4 2 D
    
  • 25

    data.table 包还有自己的 uniqueduplicated 方法以及一些附加功能 .

    unique.data.tableduplicated.data.table 方法都有一个额外的 by 参数,允许您分别传递 characterinteger 列名称或其位置向量

    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
    
  • 57

    使用 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
    
  • 3

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

    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() 在任何时刻返回到原始数据帧 .

  • 3

    一般答案可以是例如:

    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
    
  • 3

    你也可以使用 dplyrdistinct() 功能!它往往比其他选项更有效,特别是如果你有大量的观察 .

    distinct_data <- dplyr::distinct(yourdata)
    

相关问题