说我们有两组字母,我想将它们的同时出现表化。
例如,考虑具有列df
和Set1
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
以上结果恰好是我在Set1
和Set2
中寻找的结果,我们将“ A”与“ C”配对了两次,依此类推。 。
我对不配对的字母也很感兴趣,例如在Set1
和Set2
中,我们有“ 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 %>%
管道获得期望的结果?
答案 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