我有一个看起来像这样的数据框:
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"))
答案 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