如何修复`group_by`语句

时间:2019-05-03 18:51:06

标签: r dplyr

我在使用简单的chmoddplyrgroup_by链时遇到了问题。

我为执行542例不同诊断程序而感到吃惊。 这是两个选定的列:

summarise

我想对数据进行汇总,以查看每个执行了多少程序 诊断:

> data %>% select(Diagnosis, Split)
# A tibble: 542 x 2
   Diagnosis Split
       <dbl> <dbl>
 1         5     4
 2         3     3
 3         1     1
 4         1     1
 5         3     3
 6         1     1
 7         1     1
 8         2     2
 9         7     4
10         1     1
# … with 532 more rows

但是现在我宁愿知道诊断名称,因为数字没有意义,所以我 创建各种“查找表”:

> data %>% group_by(Diagnosis) %>% summarise(procedures =n())
# A tibble: 7 x 2
  Diagnosis procedures
      <dbl>      <int>
1         1        262
2         2         91
3         3         63
4         4         36
5         5         37
6         6         31
7         7         22

然后我重新编写分组摘要,如下所示:

>diagNames    <- c("1" = "ENT",
+                  "2" = "MND",
+                  "3" = "CVA",
+                  "4" = "INJ",
+                  "5" = "NEU",
+                  "6" = "UNK",
+                  "7" = "OES"
)

虽然输出的顺序已更改为字母的顺序 诊断列,实际输出正是我想要的,我可以 > data %>% + group_by (diagnosis = diagNames[Diagnosis]) %>% + summarise(procedures = n()) # A tibble: 7 x 2 diagnosis procedures <chr> <int> 1 CVA 63 2 ENT 262 3 INJ 36 4 MND 91 5 NEU 37 6 OES 22 7 UNK 31 (如果需要)。

现在我再次尝试了另一组427个程序,这次是 想要按性别分组的摘要:

arrange()

再次,我宁愿性别是可读的文本,而不是一个容易忘记的数字。所以,一个 查询表:

> data %>% select(Sex, Success)
# A tibble: 427 x 2
     Sex Success
   <dbl>   <dbl>
 1     0       1
 2     1       1
 3     0       1
 4     0       1
 5     0       1
 6     0       1
 7     1       0
 8     1       1
 9     1       1
10     1       1
# … with 417 more rows

> data %>%
      group_by (Sex) %>%
      summarise(procedures = n())
# A tibble: 2 x 2
    Sex procedures
  <dbl>      <int>
1     0        157
2     1        270

然后,我使用与我几乎相同的语法重新编写分组摘要 在第一个小标题上:

> genderNames <- c("0" = "Woman",
+                  "1" = "Man"
+ )

为什么第一个示例没有生成错误?

我试图进行故障排除;我唯一看到的区别是“诊断” 是从1到7,而“性别”从0开始。当然这不是问题吗?

有什么建议吗?谢谢

1 个答案:

答案 0 :(得分:1)

正如OP先前所提到的,使用0索引破坏了代码。

此解决方案使用tidyverse中的两个软件包。您将需要加载以下内容:

library(tibble)
library(dplyr)

解决此问题的一种方法是将Sex变量简单地包装为as.character()。

data %>%
  group_by(gender = genderNames[as.character(Sex)]) %>%
  summarise(procedures = n())

一种替代方法是创建一个小标题以用作查找表并加入该表。

genderLookup <- tibble(Sex = c(0,1), gender = c('Woman','Man'))

然后,您可以加入新创建的查找表。

data %>%
  left_join(genderLookup, keep = FALSE) %>%
  group_by(gender) %>%
  summarise(procedures = n())

keep = FALSE将删除连接变量。

这两种方法都可以,但是第二种方法对于可读性和调试更有利。