сравнить кадры данных на предмет несоответствия и переназначить строку, если › несоответствие

В попытке заменить несоответствия между двумя фреймами данных ниже мне уже удалось создать новый фрейм данных, в котором несоответствия заменены. Теперь я ищу более эффективный способ сделать это с помощью пакета ifelse или data.table:

dfA <- structure(list(animal1 = c("AA", "TT", "AG", "CA"), animal2 = c("AA", "TB", "AG", "CA"), animal3 = c("AA", "TT", "AG", "CA")), .Names = c("animal1", "animal2", "animal3"), row.names = c("snp1", "snp2", "snp3", "snp4"), class = "data.frame")
# > dfA
#      animal1 animal2 animal3
# snp1      AA      AA      AA
# snp2      TT      TB      TT
# snp3      AG      AG      AG
# snp4      CA      CA      CA
dfB <- structure(list(animal1 = c("AA", "TT", "AG", "CA"), animal2 = c("AA", "TB", "AG", "DF"), animal3 = c("AA", "TB", "AG", "DF")), .Names = c("animal1", "animal2", "animal3"), row.names = c("snp1", "snp2", "snp3", "snp4"), class = "data.frame")
#> dfB
#     animal1 animal2 animal3
#snp1      AA      AA      AA
#snp2      TT      TB      TB
#snp3      AG      AG      AG
#snp4      CA      DF      DF

Когда в строке несовпадений более 50%, я присваиваю «00» всем столбцам snp:

dfC <- do.call(rbind, lapply(rownames(dfA), function(x){
    mismatchpercentage <- length(which(dfA[x,] != dfB[x,]) == FALSE) / length(dfA[x,]) 
    if(mismatchpercentage > 0.5){
        dfA[x,] <- "00"
    }
    dfA[x, which(dfA[x,] != dfB[x,])] <- "00"
    dfA[x,]
    }))
data.frame(dfC)

# > data.frame(dfC)
#      animal1 animal2 animal3
# snp1      AA      AA      AA
# snp2      TT      TB      00
# snp3      AG      AG      AG
# snp4      00      00      00

часть этого можно сделать с помощью следующего кода, однако это только часть решения, теперь мне нужно заменить последнюю строку на все 00:

as.data.frame(ifelse(as.matrix(dfA) == as.matrix(dfB), as.matrix(dfA), "00"))
#      animal1 animal2 animal3
# snp1      AA      AA      AA
# snp2      TT      TB      00
# snp3      AG      AG      AG
# snp4      CA      00      00

person Bas    schedule 13.04.2016    source источник
comment
@akrun требуемый вывод в обоих моих других вопросах отличается от этого. Другой вопрос в основном является продолжением.   -  person Bas    schedule 13.04.2016
comment
Ссылка на дубликат была предоставлена ​​​​кто-то. Я просто щелкнул по нему после того, как другой человек проголосовал за обман.   -  person akrun    schedule 13.04.2016
comment
Этот вопрос не является дубликатом   -  person Bas    schedule 22.04.2016


Ответы (1)


Это может реализовать ваше правило 50%:

dfA.m <- as.matrix(dfA)
dfB.m <- as.matrix(dfB)
i.arr <- which(dfA.m != dfB.m, arr.ind=TRUE)
mm <- (dfA.m != dfB.m)  # mismatches
mm[rowSums(mm) > ncol(dfA.m)/2, ] <- TRUE
person jogo    schedule 13.04.2016
comment
работает как шарм, я изменил его на требуемый вывод, добавив это: ifelse(mm, "00", dfA.m) - person Bas; 13.04.2016