【问题标题】:Create an overlap matrix from group1, group2, overlap_count?从 group1、group2、overlap_count 创建一个重叠矩阵?
【发布时间】:2020-12-28 05:31:19
【问题描述】:

我有一个数据框,其中 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'))

之前有人问过与overlap between groups 类似的问题,但是我们有一个组列表和其中的项目,并且想要找出组之间有多少项目重叠。

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

【问题讨论】:

  • @tmfmnk 我不同意你的骗术。请看我的回答。如果您仍然认为它是重复的,请告诉我。干杯。
  • @M-- 不是问题,这确实是一个不同的问题。另一方面,我敢肯定,这也被反复回答。

标签: r dataframe data.table reshape tidyr


【解决方案1】:

这与How to reshape data from long to wide format 相似,只是 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

【讨论】:

    【解决方案2】:

    如果您(或其他人)正在寻找tidyverse-解决方案,这会有所帮助

    tidyr::pivot_wider(df, g1, names_from = g2, values_from = val, values_fill = 0) %>% 
      tibble::column_to_rownames("g1")
    #    a b c d
    # a 10 4 1 0
    # b  4 5 0 0
    # c  1 0 3 0
    # d  0 0 0 4
    

    【讨论】:

      【解决方案3】:

      base R,我们可以使用xtabs

      xtabs(val ~ g1 + g2, df1)
      #   g2
      #g1   a  b  c  d
      #  a 10  4  1  0
      #  b  4  5  0  0
      #  c  1  0  3  0
      #  d  0  0  0  4
      

      【讨论】:

        【解决方案4】:

        此解决方案使用 data.table 库。

        dcast(setDT(df), g1 ~ g2, value.var = "val", fill = 0)
        

        【讨论】:

        • 如果这是您所追求的答案,那么问题是重复的。这不会像您在上面所需的输出中显示的那样将 g1 作为行名。请尽量清晰准确地提出您的问题。
        • 它已经足够接近我想要它去的地方了。下一步就是用第一列中的值重命名行,然后删除第一列。抱歉,我应该在答案中包含这一步。
        猜你喜欢
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2017-07-14
        • 1970-01-01
        • 2017-08-25
        相关资源
        最近更新 更多