删除两列中的重复项(无组合)

时间:2018-09-08 04:05:31

标签: r dataframe duplicates

我有一个看起来像这样的数据框:

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

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分: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