Удаление дубликатов в двух столбцах (без комбинации) - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть фрейм данных, который выглядит следующим образом:

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 голосов
/ 08 сентября 2018

Если вы можете терпеть отсутствие факторов в ваших данных,

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
0 голосов
/ 08 сентября 2018

Вы можете попробовать рекурсию, которая вызывает сама себя, пока есть строки, которые могут быть дубликатами. Это очень опасно, поскольку поврежденный ввод будет работать до тех пор, пока не останется памяти.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...