【问题标题】:From a network pair frequency dataset, how to assign a corresponding count for each group and their association with another group?从网络对频率数据集中,如何为每个组分配相应的计数以及它们与另一个组的关联?
【发布时间】:2021-07-02 17:47:18
【问题描述】:

这是数据集

structure(list(V1 = structure(c(2L, 3L, 4L, 5L, 3L, 4L, 5L, 4L, 
5L), .Label = c("ABC", "DEF", "GHI", "JKL", "MNO"), class = "factor"), 
V2 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L), .Label = c("ABC", 
"DEF", "GHI", "JKL", "MNO"), class = "factor"), Freq = c(3L,                                                                                                                                     
2L, 3L, 2L, 3L, 1L, 2L, 1L, 1L)), row.names = c(NA, 9L), class = "data.frame")
                                                                            

看起来像这样

   V1  V2 Freq
1  DEF ABC    3
2  GHI ABC    2
3  JKL ABC    3
4  MNO ABC    2
5  GHI DEF    3
6  JKL DEF    1
7  MNO DEF    2
8  JKL GHI    1
9  MNO GHI    1

我想创造这样的东西

x       y
ABC     4
DEF     4
GHI     4
JKL     3
MNO     3

请注意,ABC 与 DEF、GHI、JKL 和 MNO 有 4 次关联。这对应于第 1、2、3 和 4 行。JKL 与 ABC、DEF 和 GHI 有 3 次关联。这对应于第 3、6 和 8 行。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以通过几种方式做到这一点

    1. 我们split,每列由对方转成list。获取lengths,将(+) 和stack 添加到2 列data.frame
    stack(lengths(split(as.character(df1$V2), df1$V1)) + 
           lengths(split(as.character(df1$V1), df1$V2)))[2:1]
    

    -输出

     ind values
    1 ABC      4
    2 DEF      4
    3 GHI      4
    4 JKL      3
    5 MNO      3
    

    1. 或者在列上执行table+ 他们,得到rowSums,和stack
    stack( rowSums(table(df1[2:1]) + table(df1[1:2])))[2:1]
    

    【讨论】:

      【解决方案2】:

      也可以使用这个解决方案:

      library(dplyr)
      library(purrr)
      library(tibble)
      
      df %>%
        select(V1, V2) %>%
        unlist() %>% 
        unique() %>% 
        enframe() %>%
        mutate(freq = map_int(value, function(a) pmap_lgl(df[-3], ~ a %in% c(...)) %>% reduce(`+`))) %>%
        arrange(value) %>%
        select(-name)
      
      # A tibble: 5 x 2
        value  freq
        <fct> <int>
      1 ABC       4
      2 DEF       4
      3 GHI       4
      4 JKL       3
      5 MNO       3
      

      【讨论】:

        【解决方案3】:

        我们可以试试table + stack

        > rev(stack(table(unlist(df[-3]))))
          ind values
        1 ABC      4
        2 DEF      4
        3 GHI      4
        4 JKL      3
        5 MNO      3
        

        或带有degreeigraph 选项,如下所示

        > rev(stack(degree(graph_from_data_frame(df))))
          ind values
        1 DEF      4
        2 GHI      4
        3 JKL      3
        4 MNO      3
        5 ABC      4
        

        【讨论】:

        • 一开始我尝试了igraph,但最终在一些黑暗、阴暗的地方。我想这对我来说还不安全。
        • 没错,我只需要先学习基础知识,然后尝试应用它们。
        【解决方案4】:

        如果我理解正确,OP 想要计算 V1V2 两列中每个项目的出现次数。

        这可以通过重塑和计算长格式的出现来解决:

        library(data.table)
        melt(setDT(df), measure.vars = patterns("^V"))[, .N, keyby = value]
        
           value N
        1:   ABC 4
        2:   DEF 4
        3:   GHI 4
        4:   JKL 3
        5:   MNO 3
        

        dplyr & tidyr:

        library(dplyr)
        library(tidyr)
        df %>% 
          pivot_longer(starts_with("V")) %>% 
          count(value)
        
        # A tibble: 5 x 2
          value     n
          <fct> <int>
        1 ABC       4
        2 DEF       4
        3 GHI       4
        4 JKL       3
        5 MNO       3
        

        【讨论】:

          【解决方案5】:

          janitor 也有帮助

          janitor::tabyl(c(df$V1, df$V2))
          #>  c(df$V1, df$V2) n   percent
          #>              ABC 4 0.2222222
          #>              DEF 4 0.2222222
          #>              GHI 4 0.2222222
          #>              JKL 3 0.1666667
          #>              MNO 3 0.1666667
          

          reprex package (v2.0.0) 于 2021-07-03 创建

          【讨论】:

          • 门卫大师也:D
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-14
          • 2019-08-11
          • 2021-05-15
          • 1970-01-01
          • 1970-01-01
          • 2020-11-16
          相关资源
          最近更新 更多