我有一个如下所示的数据框:
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"))
如果您可以容忍数据中没有因素,
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
您可以尝试递归调用自身,同时仍然存在可能重复的行。这是非常危险的,因为损坏的输入将使其运行直到没有内存。
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)