我在使用简单的chmod
,dplyr
和group_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开始。当然这不是问题吗?
有什么建议吗?谢谢
答案 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将删除连接变量。
这两种方法都可以,但是第二种方法对于可读性和调试更有利。