首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较不匹配的数据帧和重新分配行(如果>不匹配)

比较不匹配的数据帧和重新分配行(如果>不匹配)
EN

Stack Overflow用户
提问于 2016-04-13 09:07:34
回答 1查看 46关注 0票数 0

为了替换下面两个数据帧之间的不匹配,我已经创建了一个新的数据框架,其中不匹配被替换。我现在正在寻找一种更有效的方法来使用ifelse或data.table包来完成这个任务:

代码语言:javascript
复制
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的所有列:

代码语言:javascript
复制
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的代码替换最后一行:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-13 09:13:24

这可以实现您的50%规则:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36593596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档