列出两组之间的匹配数(包括零个匹配项)

时间:2018-07-19 01:25:50

标签: r dplyr

说我们有两组字母,我想将它们的同时出现表化。 例如,考虑具有列dfSet1

的小型数据帧Set2

库(dplyr)

Set1 = c("B", "A", "E", "B", "C", "B", "A", "B", "A", "E")
Set2 = c("E", "A", "B", "B", "E", "B", "C", "D", "C" ,"D")
df <- data.frame(Set1, Set2)

它看起来像这样:

   Set1 Set2
1     B    E
2     A    A
3     E    B
4     B    B
5     C    E
6     B    B
7     A    C
8     B    D
9     A    C
10    E    D

可以使用表格函数轻松计算每组中的比赛数:

as.data.frame(with(df, table(Set1, Set2)))

  Set1 Set2 Freq
1     A    A    1
2     B    A    0
3     C    A    0
4     E    A    0
5     A    B    0
6     B    B    2
7     C    B    0
8     E    B    1
9     A    C    2
10    B    C    0
11    C    C    0
12    E    C    0
13    A    D    0
14    B    D    1
15    C    D    0
16    E    D    1
17    A    E    0
18    B    E    1
19    C    E    1
20    E    E    0 

以上结果恰好是我在Set1Set2中寻找的结果,我们将“ A”与“ C”配对了两次,依此类推。 。 我对不配对的字母也很感兴趣,例如在Set1Set2中,我们有“ A”没有与“ E”配对,依此类推。

使用我喜欢用于高级分包的dplyr包,我发现我无法在子集数据帧上使用table()函数,所以我听说count函数是替代方法:

df %>%
    count(Set1, Set2) %>% 
    print()

# A tibble: 8 x 3
  Set1  Set2      n
  <fct> <fct> <int>
1 A     A         1
2 A     C         2
3 B     B         2
4 B     D         1
5 B     E         1
6 C     E         1
7 E     B         1
8 E     D         1

这与表函数给我的结果类似,只是频率0的同时出现已被丢弃。 count()函数的文档指出,它不计入缺失值,因此其行为与预期完全相同。

那么我如何使用dplyr软件包和所有出色的dplyr %>%管道获得期望的结果?

1 个答案:

答案 0 :(得分:1)

可以选择先spread,然后再gather。通过转换为“宽”格式并指定fill = 0,它变得与table的输出几乎相似,然后gather将其返回为“长”格式

library(tidyverse)
df %>% 
   count(Set1, Set2) %>%
   spread(Set2, n, fill = 0) %>% 
   gather(Set2, n, A:E)
# A tibble: 20 x 3
#   Set1  Set2      n
#   <fct> <chr> <dbl>
# 1 A     A         1
# 2 B     A         0
# 3 C     A         0
# 4 E     A         0
# 5 A     B         0
# 6 B     B         2
# 7 C     B         0
# 8 E     B         1
# 9 A     C         2
#10 B     C         0
#11 C     C         0
#12 E     C         0
#13 A     D         0
#14 B     D         1
#15 C     D         0
#16 E     D         1
#17 A     E         0
#18 B     E         1
#19 C     E         1
#20 E     E         0