【问题标题】:Removing duplicate rows from data.frame (with some details about column ordering)从 data.frame 中删除重复行(包含有关列排序的一些详细信息)
【发布时间】:2012-01-24 15:06:06
【问题描述】:

我有一个包含 12 列和很多行的大型 data.frame,但让我们简化

  Id A1  A2  B1  B2  Result
  1  55  23  62  12  1
  2  23  55  12  62  1                 * (dup of Id 1)
  3  23  6   2   62  1
  4  23  55  62  12  1                 * (dup of Id 1)
  5  21  62  55  23  0                 * (dup of Id 1)
  6 . . . 
  . .
  .   . 
  .     .

现在 A 的 (A1, A2) 和 B 的 (B1, B2) 的顺序无关紧要。如果它们都具有相同的值,例如 (55,23)(62,12),则无论 A 和 B 变量的顺序如何,它们都是重复的。

此外,如果 A_id_x = B_id_yB_id_x = A_id_yResult_id_x = 1 - Result_id_y 我们也有重复。

如何清理这一帧重复项?

【问题讨论】:

  • Id 3 是否也是 Id 1 的副本,因为 x[1,"A2"]==x[3, "A1"] 和 x[1,"B1"]==x[ 3,"B2"]?

标签: r duplicates


【解决方案1】:

对于第一个,我将创建一个新变量,执行如下操作:

tc= 'Id A1  A2  B1  B2  Result
  1  55  23  62  12  1
  2  23  55  12  62  1                  
  3  23  6   2   62  1
  4  23  55  62  12  1                  
  5  21  62  55  23  0'

df =read.table(textConnection(tc),header=T)
df$tmp = paste(apply(df[,2:3],1,min),apply(df[,2:3],1,max),sep='')
subset(df, !duplicated(tmp))

对于第二部分,您的符号相当混乱,但也许您可以遵循类似的程序。

【讨论】:

  • 我想说的是 A 和 B 是 sets 并且 A=(x,y), B=(v,z), res=1 是同A=(v,z), B=(x,y), res=0
【解决方案2】:

这个怎么样:

    tc= 'Id A1  A2  B1  B2  Result
      1  55  23  62  12  1
      2  23  55  12  62  1                  
      3  213  6   2   62  1
      4  23  55  62  12  1                  
      5  21  62  55  23  0'

    x <- read.table(textConnection(tc),header=T)

    a1b1 <- transform(x, combi="a1b1", a=A1, b=B1)
    a1b2 <- transform(x, combi="a1b2", a=A1, b=B2)
    a2b1 <- transform(x, combi="a2b1", a=A2, b=B1)
    a2b2 <- transform(x, combi="a2b2", a=A2, b=B2)

    x_long <- rbind(a1b1,a1b2,a2b1,a2b2)
    idx <- duplicated(x_long[,c("a", "b")])
    dup_ids <- unique(x_long[idx, "Id"])
    unique_ids <- setdiff(x_long$Id, dup_ids)

    x[unique_ids,]

关于Result 部分,我不清楚你的意思。

【讨论】:

    【解决方案3】:

    查看allelematch 包。虽然此软件包主要用于在包含等位基因型数据的 data.frame 中查找匹配行,但它适用于任何来源的数据。

    当您处理需要超越duplicated() 提供的完美匹配功能的案例时,您可能会特别感兴趣。 allelematch 处理丢失的数据和不匹配的数据(即,并非两个行向量的所有元素都匹配或存在)。它通过识别数据框中最相似的行来返回候选匹配。

    这可能比您需要的功能更多 - 听起来好像您的列已经以某种一致的方式排列(从您的帖子中不清楚这是什么)。但是,如果识别一致排列本身就是一个挑战,那么这种经验方法可能会有所帮助。

    【讨论】:

      【解决方案4】:

      我最终使用 Excel VBA 编程来解决问题

      这是程序:

      • 内部对所有行的每个 A 和每个 B 进行排序

      • 然后将Result = 0的A和B的位置翻转,将Result改为1

      • 删除重复项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 2015-03-30
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多