【问题标题】:Removing Duplicates in Two Columns (No Combination)删除两列中的重复项(无组合)
【发布时间】:2018-09-08 13:55:54
【问题描述】:

我有一个如下所示的数据框:

Input <- data.frame(ID  = c("1",   "2",  "3",  "4",  "5",  "6",  "7",  "8"),
                    V1  = c("A1", "A1", "G2", "G3", "G3", "G1", "G3",  "G1" ),
                    V2  = c("A1", "G2", "A1", "G2", "G3", "G3", "G1",  "G3" ))

我想删除 ,其中“V1”和“V2”两列中的(单个)观察结果重复无论(单个)特定观察是否在“V1”或“V2”。 结果应如下所示(例如,A1 出现在第 2 行和第 3 行:删除第 2 行和第 3 行)。

Output <- data.frame(ID  = c("1",   "4"),
                     V1  = c("A1", "G3"),
                     V2  = c("A1", "G2"))

【问题讨论】:

  • 或许t(apply(Input[-1], 1, sort)) -&gt; m1; &gt; !(duplicated(m1)|duplicated(m1, fromLast = TRUE)) -&gt; i1; Input[i1,]
  • 谢谢,但代码不起作用。如果我调整代码,仍然会列出第 5 行(鉴于第 4 行中的 G3,这是错误的)
  • 鉴于 G3 出现在第 4 行,因此应删除第 5 行。
  • 我认为 duplicates 表明第一次出现不是重复的,只有后面的那些(匹配)。
  • 如果第 4 行因为“G3”是新的而保留,那么第 2 行不应该因为“G2”而保留吗?

标签: r dataframe duplicates


【解决方案1】:

如果您可以容忍数据中没有因素,

Input <- data.frame(ID  = c("1",   "2",  "3",  "4",  "5",  "6",  "7",  "8"),
                    V1  = c("A1", "A1", "G2", "G3", "G3", "G1", "G3",  "G1" ),
                    V2  = c("A1", "G2", "A1", "G2", "G3", "G3", "G1",  "G3" ),
                    stringsAsFactors=FALSE)

那么你可以使用这个:

ind <- Reduce(function(lgl, i) {
  lgl[i] <- lgl[i] && !any(Input[i,-1] %in% unlist(Input[which(head(lgl,i-1)),-1]))
  lgl
}, seq_len(nrow(Input))[-1], init=rep(TRUE, nrow(Input)))

Input[ind,]
#   ID V1 V2
# 1  1 A1 A1
# 4  4 G3 G2

【讨论】:

    【解决方案2】:

    您可以尝试在仍有可能重复的行时调用自身的递归。这是非常危险的,因为损坏的输入会使它运行到没有内存为止。

    removeDuplicates <- function(data) {
        rm <- c(data[1, ]$V1, data[1, ]$V2)
        dataAfter <- subset(data[seq_len(nrow(data))[-1], ], !V1 %in% rm & !V2 %in% rm)
        return(rbind(data[1, ], 
                     if (nrow(dataAfter) > 1) {
                        removeDuplicates(dataAfter)
                     } else {
                        NULL
                     }
         ))
    }
    
    removeDuplicates(Input)
      ID V1 V2
    1  1 A1 A1
    4  4 G3 G2
    

    输入数据(修改去除因素):

    Input <- data.frame(ID  = c("1",   "2",  "3",  "4",  "5",  "6",  "7",  "8"),
                        V1  = c("A1", "A1", "G2", "G3", "G3", "G1", "G3",  "G1" ),
                        V2  = c("A1", "G2", "A1", "G2", "G3", "G3", "G1",  "G3" ),
                        stringsAsFactors = FALSE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-22
      • 2018-12-13
      • 2010-11-22
      • 2015-11-29
      • 2023-03-20
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多