【问题标题】:How to get the frequency from grouped data with dplyr?如何使用 dplyr 从分组数据中获取频率?
【发布时间】:2018-03-14 16:27:40
【问题描述】:

这当然是一个基本问题,但我自己无法弄清楚。请考虑以下几点:

在具有长格式患者特征的大型数据集中,我想总结一些变量。我更愿意使用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

【问题讨论】:

  • 预期的输出是 #man woman # 1 2
  • dplyrcounttally
  • 哎呀对不起@konvas,刚刚发布了我的答案,还没有看到你的评论。我将直接归功于它。

标签: r group-by dplyr


【解决方案1】:
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

【讨论】:

  • 在这种情况下我完全不理解 n。由于 ID 相同,男性和 2 年级的唯一组合应该是 1 而不是 2。女性和 1 年级和 3 年级也是如此(每个只有 1 个组合)。
  • 当这个答案没有给出你想要的东西时,请给我们你想要的输出。每个唯一的性别/年级组合只有一行 (!),这里只有一行带有“man/grade2”。最后一行显示了这种组合在您的数据中出现的频率。
  • 修改 Tjebo 的建议给了我想要的输出:x &lt;- db %&gt;% group_by(Gender, Grade) %&gt;% tally()table(x$Gender)# man woman # 1 2 我的困惑是,根据 ID,只有 2 位女性和 1 位男性。尽管 tibble 中的 n 给出了我的数据集中的组合数量,但该组合对于每一行应该是 1,因为总共只有三个观察值(根据 ID)。
  • 添加了另一个选项。
【解决方案2】:
require(dplyr)
require(magrittr)
db %>% count(ID, Gender) %$% table(Gender)

或者,没有dplyr

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2022-12-12
    • 2013-08-24
    相关资源
    最近更新 更多