从data.frame中删除重复的行(包含有关列排序的一些详细信息)

时间:2012-01-24 15:06:07

标签: r duplicates

我有一个包含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_y以及Result_id_x = 1 - Result_id_y我们也有重复。

如何清理这个重复框架?

4 个答案:

答案 0 :(得分:4)

对于第一个我会创建一个新的变量做这样的事情:

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))

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

答案 1 :(得分:1)

这个怎么样:

    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部分,我不清楚你的意思。

答案 2 :(得分:0)

查看allelematch包。虽然此软件包主要用于查找由等位基因型数据组成的data.frame中的匹配行,但它可以处理任何来源的数据。

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

这可能比您需要的功能更多 - 听起来好像您的列已经以某种一致的方式进行了置换(这一点并不完全清楚您的帖子中的内容)。但是,如果确定一致的排列本身就是一个挑战,那么这种经验方法可能会有所帮助。

答案 3 :(得分:-1)

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

这是程序:

  • 为所有行内部排序每个A和每个B

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

  • 删除重复项