首页 > 解决方案 > 从 group1、group2、overlap_count 创建一个重叠矩阵?

问题描述

我有一个数据框,其中 g1、g2 代表两个组,还有一个 val 列,表示在 g2 中也可以找到 g1 中的多少项目的计数。

## Input dataframe
data.frame(
  g1 = c('a','a','a','b','b','b','c','c','c','d'),
  g2 = c('a','b','c','a','b','c','a','b','c','d'),
  val = c(10,4,1,4,5,0,1,0,3,4),
  stringsAsFactors = FALSE
)

我在格式化数据框时遇到问题,如下所示。我可以创建一个空的命名矩阵,其具有来自 g1/g2 的不同列/行名称,并遍历输入数据帧中的每一行,将其值写入匹配的 g1:row-id g2:column-id 组合,但这似乎效率低下;我想知道是否有任何库提供了一种自动化方法?

## Output overlap matrix
data.frame(a = c(10,4,1,0),
           b = c(4,5,0,0),
           c = c(1,0,3,0),
           d = c(0,0,0,4),
           row.names = c('a','b','c','d'))

之前已经提出过关于组之间重叠的类似问题,但是我们有一个组列表和其中的项目,并且想要找出组之间有多少项目重叠。

在这里,我知道组之间有多少项目重叠,但无法以正确的方式对其进行格式化。

标签: rdataframedata.tablereshapetidyr

解决方案


这类似于如何将数据从长格式重塑为宽格式,略有不同的是 id 列应保留为行名。为此,我们可以使用reshape2::acast.

reshape2::acast(Input_dataframe, formula = g1 ~ g2, fill = 0)

 # >    a b c d
 # > a 10 4 1 0
 # > b  4 5 0 0
 # > c  1 0 3 0
 # > d  0 0 0 4

推荐阅读