【问题标题】:compare data frames for mismatches and reassign row if > mismatches [duplicate]比较数据帧是否不匹配,如果 > 不匹配则重新分配行 [重复]
【发布时间】:2016-04-13 09:07:34
【问题描述】:

为了尝试替换下面两个数据框之间的不匹配,我已经设法创建了一个新的数据框,其中替换了不匹配。我现在正在寻找一种更有效的方法来使用 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

【问题讨论】:

  • @akrun 我的另一个问题中所需的输出与这个不同。另一个问题基本上是后续问题。
  • 欺骗链接是由某人提供的。在对方给出初步的欺骗投票后,我才点击它。
  • 这个问题不是重复的

标签: r dataframe compare data.table mismatch


【解决方案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

【讨论】:

  • 就像一个魅力,我已将其更改为我需要的输出添加:ifelse(mm, "00", dfA.m)
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多