【问题标题】:Apply function to multiple vectors and output pairwise comparisons to matrix将函数应用于多个向量并将成对比较输出到矩阵
【发布时间】:2019-03-07 15:50:53
【问题描述】:

我有 3 个包含超过 1500 个字符串元素的向量,我想对它们进行成对比较以输出它们之间匹配元素的数量。

我的数据减少了:

va <- c("6a460daf68eb0410b51d79e495fbccc7", "e1b32017108e17e41bdabc44bac4df3c", "6ac1327da92d8584008db04b4eaf62d0", "b01a2322e2ca99315646d79cf157cb20", "12dadc27059ea5d3c8cc54e9a28cc4f6", "be73c9685b743a646f2eb0480eee2f8d")
vb <- c("6a460daf68eb0410b51d79e495fbccc7", "e1b32017108e17e41bdabc44bac4df3c","JQ183785.1.1345", "DQ794886.1.1390", "HQ791014.1.1450", "EU764755.1.1328")
vc <- c("6a460daf68eb0410b51d79e495fbccc7", "JQ183785.1.1345", "DQ794886.1.1390", "HQ791014.1.1450", "b01a2322e2ca99315646d79cf157cb20", "EF532786.1.1364")

我做了一个函数,用于输出两个向量之间重合元素的数量:

sharing <- function(v1, v2, share=TRUE){
  if(isTRUE(share)){sh <- length(v1[ v1 %in% v2])}
  else if (isFALSE(share)){sh <- length(v1[ ! v1 %in% v2])}
  return(sh)
}

因此,应用此函数 9 次(每次成对比较包括自我比较一次),我将能够得到 9 个具有共享元素的数字:

> sharing(va,va); sharing(va,vb); sharing(va,vc)
[1] 6
[1] 2
[1] 2
> sharing(vb,va); sharing(vb,vb); sharing(vb,vc)
[1] 2
[1] 6
[1] 4
> sharing(vc,va); sharing(vc,vb); sharing(vc,vc)
[1] 2
[1] 4
[1] 6

但我想把它作为一个矩阵:

    va   vb   vc
va   6    2    2
vb   2    6    4
vc   2    4    6

是否有任何预制函数或代码可以做到这一点?

感谢您的帮助!

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    一个选项是outersharing 函数应用于vectors 在list ('lst1') 中的成对组合

    lst1 <- mget(paste0("v", letters[1:3])) # placed the vectors in a list
    out <- outer(lst1, lst1, FUN = Vectorize(sharing)) #apply the sharing
    dimnames(out) <- list(names(lst1), names(lst1)) # set the dim names
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2021-06-20
      • 1970-01-01
      • 2017-11-07
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      相关资源
      最近更新 更多