如何使用dplyr从分组数据中获取频率?

时间:2018-03-14 16:27:41

标签: r group-by dplyr

这当然是一个基本问题,但我自己无法弄明白。请考虑以下事项:

在具有长格式患者特征的大型数据集中,我想总结一些变量。我更愿意使用dplyr

对于示例数据集:

db <- data.frame(ID = c(rep(1, 3), rep(2,4), rep(3, 2)),
                  Gender = factor(c(rep("woman", 7), rep("man", 2))),
                  Grade = c(rep(3, 3), rep(1, 4), rep(2, 2)))
db
#    ID Gender Grade
#  1  1 woman     3
#  2  1 woman     3
#  3  1 woman     3
#  4  2 woman     1
#  5  2 woman     1
#  6  2 woman     1
#  7  2 woman     1
#  8  3   man     2
#  9  3   man     2

我想为GenderGrade制作频率表。显然,有2名女性患者和1名男性。每个等级(1:3)出现一次。

我试过了:

x <- db %>% group_by(ID, Gender, Grade)
  table(y$Gender)
x
# A tibble: 9 x 3
# Groups:   ID, Gender, Grade [3]
#     ID Gender Grade
#  <dbl> <fct>  <dbl>
# 1    1. woman     3.
# 2    1. woman     3.
# 3    1. woman     3.
# 4    2. woman     1.
# 5    2. woman     1.
# 6    2. woman     1.
# 7    2. woman     1.
# 8    3. man       2.
# 9    3. man       2.

但是当我打电话给table(x$Gender)时,结果是:

table(y$Gender)

#    man woman 
#      2     7 

我做错了什么?

提前多多感谢!

  

编辑:所需的输出是有一个频率表,其中包含数据集中有多少男性/女性参与者,以及有多少患者有1,2,3等等。请参阅下文。

以下我可以在db中调用女性的百分比:

db %>%
summarise(pct.female = mean(Gender == "woman", na.rm = T))
#    pct.female
# 1  0.7777778

我宁愿需要的是男性/女性(n)的数量。像这样:

# man    woman
#   1        2

2 个答案:

答案 0 :(得分:2)

require(dplyr)
require(magrittr)
db %>% count(ID, Gender) %$% table(Gender)

或者,没有dplyr

require(magrittr)
db %$% split(Gender, ID) %>% sapply(unique) %>% table

答案 1 :(得分:2)

require(dplyr)
db %>% group_by(Gender, Grade) %>% tally()

# A tibble: 3 x 3
# Groups:   Gender [?]
  Gender Grade     n
  <fct>  <dbl> <int>
1 man     2.00     2
2 woman   1.00     4
3 woman   3.00     3

# Was also suggested by @konvas in their comment.

会告诉您性别和成绩的所有独特组合。每个存在多少个。这个你想要的?很难从你的问题说。期望的输出会很好。

修改  或者,根据要求的输出:

db %>% distinct(ID, Gender) %>% count(Gender) 

# A tibble: 2 x 2
  Gender `n()`
  <fct>  <int>
1 man        1
2 woman      2