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

问题描述 投票:0回答:2

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

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"))
r dataframe duplicates
2个回答
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

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)
© www.soinside.com 2019 - 2024. All rights reserved.