【问题标题】:How to remove duplicates by unique (rowwise) values in two columns [duplicate]如何通过两列中的唯一(按行)值删除重复项[重复]
【发布时间】:2017-05-28 17:08:30
【问题描述】:

我的数据如下:

df <- data.frame(x=c("A","B","C","D"), y=c("B","A","D","C"), z=c(2,2,0.4,0.4), stringsAsFactors = F)

x    y   z
A    B   2
B    A   2
C    D   0.4
D    C   0.4

我想要以下数据:

A    B   2
C    D   0.4

我该怎么做?

【问题讨论】:

  • 您是删除数字列中的重复项(假设它是一列),还是删除文本列中的重复项?请澄清并考虑一个可直接读入 R 的可重现示例。
  • df[,1:2] &lt;- t(apply(df[,1:2], 1, sort)); df[!duplicated(df),]

标签: r


【解决方案1】:

使用:

df[,1:2] <- t(apply(df[,1:2], 1, sort))
df[!duplicated(df),]

将给予:

  x y   z
1 A B 2.0
3 C D 0.4

【讨论】:

    【解决方案2】:

    您可以使用下面的代码。

    dat1 <- data.frame(X=c("A","B","C","D"),Y=c("B","A","D","C"),Z=c(2,2,0.4,0.4),stringsAsFactors = F)
    dat1
      X Y   Z
    1 A B 2.0
    2 B A 2.0
    3 C D 0.4
    4 D C 0.4
    

    让我们定义一个函数,我们可以使用它按行对记录进行排序并将其折叠成一个向量。

    sort_paste <- function(x){ paste(sort(x),collapse=";") }
    
    check_dups <- apply(dat1,1,sort_paste)
    check_dups
    [1] "2.0;A;B" "2.0;A;B" "0.4;C;D" "0.4;C;D"
    dat1[ which(! duplicated(check_dups)), ]
      X Y   Z
    1 A B 2.0
    3 C D 0.4
    

    【讨论】:

      【解决方案3】:

      假设您只是想删除 z 列中的重复项:

       subset(df, !duplicated(z))
      

      【讨论】:

        【解决方案4】:

        我们可以使用pmin/pmax

        library(data.table)
        setDT(df)[!duplicated(pmin(x,y), pmax(x,y))]
        #   x y   z
        #1: A B 2.0
        #2: C D 0.4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-17
          • 1970-01-01
          • 1970-01-01
          • 2021-11-11
          • 2018-11-27
          • 2011-12-26
          • 2018-03-21
          • 2018-04-02
          相关资源
          最近更新 更多