【问题标题】:Count rows containing combinations in a dataframe in R计算 R 中数据框中包含组合的行数
【发布时间】:2020-08-01 11:22:40
【问题描述】:

假设我有以下由字符“a”到“e”组成的数据框:

df <- data.frame(P1 = c("a","b","c"), P2 = c("b","c","d"), P3 = c("e","a","e"))

  P1 P2 P3
1  a  b  e
2  b  c  a
3  c  d  e

我想计算包含“a”到“e”的每个组合(大小 2)的数据框行数。所以在这种情况下,“a”到“e”有 10 种不同的(大小 2)组合。

t(combn(c("a","b","c","d","e"),2))

    [,1] [,2]
 [1,] "a"  "b" 
 [2,] "a"  "c" 
 [3,] "a"  "d" 
 [4,] "a"  "e" 
 [5,] "b"  "c" 
 [6,] "b"  "d" 
 [7,] "b"  "e" 
 [8,] "c"  "d" 
 [9,] "c"  "e" 
[10,] "d"  "e" 

2行有“a”和“b”的组合,1行有“a”和“c”的组合,没有行有“a”和“d”的组合,依此类推...... ...最终我想要一个看起来像这样的数据框:

   X1 X2 Count
1   a  b     2
2   a  c     1
3   a  d     0
4   a  e     ..
......... etc

对此的任何帮助将不胜感激,我在想 dplyr 或类似的东西可能有合适的东西,但没有设法找到一个没有耗时循环或类似的简单方法。

【问题讨论】:

    标签: r combinations


    【解决方案1】:

    您可以获取长格式数据并为每一行创建组合,计算组合并将其与我们为所有组合创建的数据连接以获取缺失值。

    library(dplyr) #dplyr >= 1.0.0
    library(tidyr)
    
    ref_data <- as.data.frame(t(combn(unique(unlist(df)),2)))
    
    df %>%
      mutate(row = row_number()) %>%
      pivot_longer(cols = -row) %>%
      group_by(row) %>%
      summarise(value = combn(sort(value), 2, toString)) %>%
      separate(value, c('V1', 'V2'), sep = ", ") %>%
      ungroup %>%
      count(V1, V2) %>%
      right_join(ref_data, by = c('V1', 'V2')) %>%
      mutate(n = replace_na(n, 0))
    
    
    # A tibble: 10 x 3
    #   V1    V2        n
    #   <chr> <chr> <dbl>
    # 1 a     b         2
    # 2 a     c         1
    # 3 a     e         1
    # 4 b     c         1
    # 5 b     e         1
    # 6 c     d         1
    # 7 c     e         1
    # 8 d     e         1
    # 9 a     d         0
    #10 b     d         0
    

    【讨论】:

    • 看起来正是我想要的,虽然我得到一个错误 ""Error: Column value must be length 1 (a summary value), not 3"" 在以下行之后@ 987654323@
    • 是的,要让它工作,你需要 dplyr 1.0.0。您可以更新dplyr 包。如果您在更新软件包时遇到问题,可以将 summarise 行替换为 summarise(value = list(combn(sort(value), 2, toString))) %&gt;% unnest(value) %&gt;% separate.......rest of the code
    • 非常感谢,我更新到 1.0.0 仍然很困难,但替代代码行工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2014-10-07
    • 2018-06-18
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多