【问题标题】:How to count frequency of unique pair combinations from a column of comma-separated values?如何从一列逗号分隔值中计算唯一对组合的频率?
【发布时间】:2020-10-12 11:08:44
【问题描述】:

我有一个数据框,其中有一列(“combo”)以逗号分隔的值表示在同一时间段内同时发生的事件类型。我正在寻找一种方法来计算成对组合的频率(顺序无关紧要;即 AB 和 BA 是等价的)。

玩具数据框

+------------------------+
|combo      startts endts|
| A,B       02:20  02:23 |
| A,B,D     02:23  02:25 |
| A,C       02:27  02:28 |
+------------------------+

理想输出:


+---------------------------+
|combo      | count         |
+---------------------------+
|  AB       | 2             |
|  AC       | 1             |
|  AD       | 1             |
|  BC       | 0             |
|  BD       | 1             |
|  CD       | 0             |
+-----------+---------------+

我正在考虑首先生成所有唯一的成对组合,将其放入列中,然后使用正则表达式模式匹配进行条件变异;但是,我不确定如何抽象地引用列名而不是特定的字符串模式(或者是否可能)。

感谢您的宝贵时间。

【问题讨论】:

    标签: r count combinations frequency


    【解决方案1】:

    你可以试试这个

    输入:

    df <- read.table(text = "combo      startts endts
    A,B       02:20  02:23
    A,B,D     02:23  02:25
    A,C       02:27  02:28", header = TRUE)
    

    解决方案:

    # user defined functions
    pastecollapse <- function(...) paste(..., collapse = "")
    sortedcomb2collapse <- function(x) combn(sort(x), m = 2, FUN = pastecollapse)
    
    # get combos
    combos <- strsplit(df$combo, split = ",")
    
    # all possible combos
    allcombos <- sortedcomb2collapse(unique(unlist(combos)))
    
    # existing combos
    mycombos  <- unlist(lapply(combos, sortedcomb2collapse))
    
    # count combos (show missing combos)
    as.data.frame(table(combo = factor(mycombos, levels = allcombos)), responseName = "count")
    
    #>   combo count
    #> 1    AB     2
    #> 2    AC     1
    #> 3    AD     1
    #> 4    BC     0
    #> 5    BD     1
    #> 6    CD     0
    

    同样,tidyverse:

    library(tidyr)
    library(dplyr)
    
    df_sep <- df %>% separate_rows(combo)
    allcombos <- df_sep %>% pull(combo) %>% unique %>% sortedcomb2collapse
    
    df_sep %>% 
     group_by(startts, endts) %>% 
     summarise(combo = sortedcomb2collapse(combo), .groups = "drop") %>% 
     mutate(combo = factor(combo, levels = allcombos)) %>% 
     count(combo, name = "count", .drop = FALSE)
    #> # A tibble: 6 x 2
    #>   combo count
    #>   <fct> <int>
    #> 1 AB        2
    #> 2 AC        1
    #> 3 AD        1
    #> 4 BC        0
    #> 5 BD        1
    #> 6 CD        0
    

    注意:在您的预期输出中,缺少一种可能的组合 (CD)。是不是搞错了?

    【讨论】:

    • 感谢您向我展示梳子和桌子:我有一些阅读要做!使用您的第一个解决方案,我得到以下信息:Error in strsplit(df$combo, split = ",") : non-character argument 这是通过将 (df$combo) 包装在 as.character() 中修复的。使用您的第二个解决方案,我收到以下与汇总相关的错误线路:Column `combo` must be length 1 (a summary value), not 3 是的,CD 应该在那里。那是个错误;这是一个有效的组合。我现在将它添加到理想的输出中,供未来的读者使用。
    • 第一个错误可能是由于在您的数据中combo 是一个因素。我不知道。你以正确的方式处理它。对第二个解决方案也强制执行相同的转换。如果仍有错误,请将dput(head(data))的输出添加到您的问题中,以便我找到解决方案。
    • 可能你的第二个解决方案有错误,因为你的dplyr 版本太旧了。它必须至少是 1.0.0 才能工作。如果可以,请尝试:update.packages()
    • 谢谢!更新工作;更多的阅读要做。我确实收到了一条奇怪的消息;但该功能有效。 Warning message:... is not empty. We detected these problematic arguments:needs_dots These dots only exist to allow future extensions and should be empty. Did you misspecify an argument?
    • 应该与vctrstibble相关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多