首页 文章

使用dplyr删除重复的行

提问于
浏览
99

我有一个像这样的data.frame -

set.seed(123)
df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10)
> df
   x y  z
1  0 1  1
2  1 0  2
3  0 1  3
4  1 1  4
5  1 0  5
6  0 1  6
7  1 0  7
8  1 0  8
9  1 0  9
10 0 1 10

我想根据前两列删除重复的行 . 预期产量 -

df[!duplicated(df[,1:2]),]
  x y z
1 0 1 1
2 1 0 2
4 1 1 4

我正在寻找使用 dplyr 包的解决方案 .

4 回答

  • 21

    为了完整起见,以下内容也有效:

    df %>% group_by(x) %>% filter (! duplicated(y))
    

    但是,我更喜欢使用 distinct 的解决方案,我怀疑它也更快 .

  • 160

    这是一个使用 dplyr 0.3 的解决方案 .

    library(dplyr)
    set.seed(123)
    df <- data.frame(
      x = sample(0:1, 10, replace = T),
      y = sample(0:1, 10, replace = T),
      z = 1:10
    )
    
    > df %>% distinct(x, y)
        x y z
      1 0 1 1
      2 1 0 2
      3 1 1 4
    

    Updated for dplyr 0.5

    dplyr版本0.5 distinct() 的默认行为仅返回 ... 参数中指定的列 .

    要获得原始结果,您现在必须使用:

    df %>% distinct(x, y, .keep_all = TRUE)
    
  • 2

    注意: dplyr 现在包含用于此目的的 distinct 函数 .

    原答案如下:


    library(dplyr)
    set.seed(123)
    df <- data.frame(
      x = sample(0:1, 10, replace = T),
      y = sample(0:1, 10, replace = T),
      z = 1:10
    )
    

    一种方法是分组,然后只保留第一行:

    df %>% group_by(x, y) %>% filter(row_number(z) == 1)
    
    ## Source: local data frame [3 x 3]
    ## Groups: x, y
    ## 
    ##   x y z
    ## 1 0 1 1
    ## 2 1 0 2
    ## 3 1 1 4
    

    (在dplyr 0.2中你不需要虚拟 z 变量,只能写 row_number() == 1

    我一直在考虑添加一个 slice() 函数,它的工作原理如下:

    df %>% group_by(x, y) %>% slice(from = 1, to = 1)
    

    或者可以使用 unique() 的变体来选择要使用的变量:

    df %>% unique(x, y)
    
  • 108

    在R中选择减少数据集的列时,通常最终会出现重复数据 .

    这两行给出了相同的结果 . 每个输出一个唯一的数据集,只有两个选定的列:

    distinct(mtcars, cyl, hp);
    
    summarise(group_by(mtcars, cyl, hp));
    

相关问题