【问题标题】:Pairwise comparisons across columns from two different data frames来自两个不同数据帧的列的成对比较
【发布时间】:2018-01-23 20:15:53
【问题描述】:

这是一个玩具数据框,mydf

    M1  M2  M3  M4  M5  M6  M7  M8                      
A1  2   2   1   1   1   1   0   2
A2  0   1   2   2   1   1   0   2
A3  2   0   0   1   1   0   1   1
A4  2   0   1   2   2   1   1   0
A5  1   2   0   2   2   1   0   1
A6  2   1   1   2   2   1   1   1

这是第二个数据框的屏幕截图,不匹配:

        M1      M2      M3      M4      M5  M6  M7      M8                              
A1-A2   TRUE    NA      NA      NA      NA  NA  FALSE   FALSE
A1-A3   FALSE   TRUE    NA      NA      NA  NA  NA      NA
A1-A4   FALSE   TRUE    NA      NA      NA  NA  NA      TRUE
A1-A5   NA      FALSE   NA      NA      NA  NA  FALSE   NA
A1-A6   FALSE   NA      NA      NA      NA  NA  NA      NA
A2-A1   TRUE    NA      NA      NA      NA  NA  FALSE   FALSE
A2-A3   TRUE    NA      TRUE    NA      NA  NA  NA      NA
A2-A4   TRUE    NA      NA      FALSE   NA  NA  NA      TRUE
A2-A5   NA      NA      TRUE    FALSE   NA  NA  FALSE   NA
A2-A6   TRUE    NA      NA      FALSE   NA  NA  NA      NA

现在我想定义一个函数来比较 mismatches[a,] == TRUE & mydf[b,] != 1) 的两个数据帧。因此,对于三重奏 A1-A2/A3,列 M1 的值应该为 TRUE,因为 A1-A2 == TRUE 和 A3 的 mydf 不匹配!=1。这是我想要的结果的快照

            M1      M2      M3  M4  M5  M6  M7      M8
A1-A2/A3    TRUE    NA      NA  NA  NA  NA  FALSE   FALSE
A1-A2/A4    TRUE    NA      NA  NA  NA  NA  FALSE   FALSE
A1-A2/A5    FALSE   NA      NA  NA  NA  NA  FALSE   FALSE
A1-A2/A6    TRUE    NA      NA  NA  NA  NA  FALSE   FALSE
A1-A3/A2    FALSE   FALSE   NA  NA  NA  NA  NA      NA
A1-A3/A4    FALSE   TRUE    NA  NA  NA  NA  NA      NA
A1-A3/A5    FALSE   TRUE    NA  NA  NA  NA  NA      NA
A1-A3/A6    FALSE   FALSE   NA  NA  NA  NA  NA      NA

我似乎找不到我用作工作代码模型的问题,但这里有一些类似的帖子Count Number of Pairwise Differences...;Compare all the columns pairwise...;Pairwise ... ignoring empty values。通过识别 0/2 和 2/0 成对比较,从 mydf 导出不匹配。

#make a 2/0 matrix for for calculating incompatibilities
nohets <- mydf
nohets[nohets == 1] <- NA
#the incompatibility function
incompatible <- function(a,b,x)
    x[a,]!=x[b,]

这个想法是使用相同的策略来比较 mydf 和 mismatches。

#make a trio function
trio_id <- function(a,b,x,y)
    x[a,] == TRUE & y[b,] !=1
rows <- c(row.names(mismatches),row.names(mydf))
grid <- subset(expand.grid(Var1=rows,Var2=rows))
impossible <- t(mapply(trio_id,grid$Var2,grid$Var1,
    MoreArgs=list(x=mismatches,y=mydf)))
dimnames(impossible) <- list(paste(grid$Var2,grid$Var1,
    sep="/"),names(mydf))

这会运行,但不会给出想要的结果,而是

            M1      M2  M3  M4  M5  M6  M7      M8
A1-A2/A3    NA      NA  NA  NA  NA  NA  FALSE   FALSE
A1-A2/A4    NA      NA  NA  NA  NA  NA  FALSE   FALSE
A1-A2/A5    NA      NA  NA  NA  NA  NA  FALSE   FALSE
A1-A2/A6    NA      NA  NA  NA  NA  NA  FALSE   FALSE
A1-A3/A2    FALSE   NA  NA  NA  NA  NA  NA      NA
A1-A3/A4    FALSE   NA  NA  NA  NA  NA  NA      NA
A1-A3/A5    FALSE   NA  NA  NA  NA  NA  NA      NA
A1-A3/A6    FALSE   NA  NA  NA  NA  NA  NA      NA

我不需要计算每个比较...我怀疑在“网格”中为每个可能的比较编写代码是我的问题的根源。

【问题讨论】:

    标签: r


    【解决方案1】:

    这行得通吗?

    mydf<-matrix(sample(c(0,1,2),6*8,replace = T),ncol=8)
    mismatches<-matrix(sample(c(T,F,NA),6*8,replace = T),ncol=8)
    mydf<-mydf != 1
    
    > (mydf+mismatches) == 2
          [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
    [1,]    NA    NA FALSE FALSE    NA FALSE  TRUE FALSE
    [2,] FALSE    NA FALSE  TRUE  TRUE    NA FALSE FALSE
    [3,]  TRUE    NA    NA FALSE FALSE  TRUE FALSE FALSE
    [4,] FALSE FALSE FALSE    NA    NA    NA FALSE    NA
    [5,]    NA FALSE FALSE    NA    NA FALSE  TRUE  TRUE
    [6,] FALSE FALSE  TRUE FALSE    NA  TRUE FALSE  TRUE
    

    【讨论】:

    • 是的,这行得通,谢谢!看起来矩阵需要具有相同的尺寸才能工作。我只需要确保我提前正确构建它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2019-12-13
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多