R Group_by/Summarise 未返回预期结果
R Group_by/Summarise not returning expected results
我有一个以下格式的数据集存储在 R 的大标题中:
Yr
Gender
Number
Disease
Age
Population
1901
M
100
A
1-5
1500
1901
F
105
A
1-5
1400
1901
M
23
A
6-10
1300
1901
F
87
A
6-10
1400
1901
M
102
B
1-5
1500
1901
F
103
B
1-5
1400
1901
M
42
B
6-10
1300
1901
F
67
B
6-10
1400
人口与每年的每个年龄段和性别相关联。
我需要按年份和性别分组,然后计算每年每种性别的 (number/population)(疾病类型并不重要)。
我正在使用这段代码:
group_by(Yr,Gender) %>% summarise(rate=sum(Number/sum(unique(Population))))
但是我知道这给了我不正确的结果,因为当我对产生的 M 和 F 数字求和时,它们每年都超过了它们应该做的(几乎翻了一番)。
谁能给我指出正确的方向,我认为这是因为性别和年龄的人口数据不同,但我不知道如何解决这个问题?
编辑
感谢您的回复 - 在输出中,我希望使用每个性别的数字总和计算比率,但计算的是当年的总人口,而不是分组的性别人口,即总数(每个性别)/总人口(当年)。
有了各种不同的总和,这就变成了一个多步骤的过程。
第一步是按年份、性别和年龄汇总,以确定每个年龄组的总人数,并删除该组的冗余人口值。
下一步是总结当年所有年龄和性别的总人口。
最后一步是汇总中间值以确定每年的 gender/tot pop 的总数。
#test data
df<- structure(list(Yr = c(1901L, 1901L, 1901L, 1901L, 1901L, 1901L,
1901L, 1901L, 1902L, 1902L, 1902L, 1902L, 1902L, 1902L, 1902L, 1902L),
Gender = c("M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F"),
Number = c(100L, 105L, 23L, 87L, 102L, 103L, 42L, 67L, 100L, 105L, 23L, 87L, 102L, 103L, 42L, 67L),
Disease = c("A", "A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "B", "B", "B", "B"),
Age = c("1-5", "1-5", "6-10", "6-10", "1-5", "1-5", "6-10", "6-10", "1-5", "1-5", "6-10",
"6-10", "1-5", "1-5", "6-10", "6-10"),
Population = c(1500L, 1400L, 1300L, 1400L, 1500L, 1400L, 1300L, 1400L, 1000L, 1100L,
1200L, 1300L, 1000L, 1100L, 1200L, 1300L)),
class = "data.frame", row.names = c(NA, -16L))
library(dplyr)
#step 1 & step 2 (begins after the ungroup)
intermediate <- df %>% group_by(Yr,Gender, Age) %>%
summarize(Num= sum(Number), Pop = mean(Population)) %>%
ungroup() %>%
group_by(Yr) %>% mutate(YearPop = sum(Pop)) %>% ungroup()
#final step
answer <- intermediate1 %>% group_by(Yr, Gender) %>% summarize(rate = sum(Num) / mean(YearPop))
#final answer
Yr Gender rate
<int> <chr> <dbl>
1 1901 F 0.0646
2 1901 M 0.0477
3 1902 F 0.0787
4 1902 M 0.0580
我有一个以下格式的数据集存储在 R 的大标题中:
Yr | Gender | Number | Disease | Age | Population |
---|---|---|---|---|---|
1901 | M | 100 | A | 1-5 | 1500 |
1901 | F | 105 | A | 1-5 | 1400 |
1901 | M | 23 | A | 6-10 | 1300 |
1901 | F | 87 | A | 6-10 | 1400 |
1901 | M | 102 | B | 1-5 | 1500 |
1901 | F | 103 | B | 1-5 | 1400 |
1901 | M | 42 | B | 6-10 | 1300 |
1901 | F | 67 | B | 6-10 | 1400 |
人口与每年的每个年龄段和性别相关联。 我需要按年份和性别分组,然后计算每年每种性别的 (number/population)(疾病类型并不重要)。
我正在使用这段代码:
group_by(Yr,Gender) %>% summarise(rate=sum(Number/sum(unique(Population))))
但是我知道这给了我不正确的结果,因为当我对产生的 M 和 F 数字求和时,它们每年都超过了它们应该做的(几乎翻了一番)。
谁能给我指出正确的方向,我认为这是因为性别和年龄的人口数据不同,但我不知道如何解决这个问题?
编辑
感谢您的回复 - 在输出中,我希望使用每个性别的数字总和计算比率,但计算的是当年的总人口,而不是分组的性别人口,即总数(每个性别)/总人口(当年)。
有了各种不同的总和,这就变成了一个多步骤的过程。
第一步是按年份、性别和年龄汇总,以确定每个年龄组的总人数,并删除该组的冗余人口值。
下一步是总结当年所有年龄和性别的总人口。
最后一步是汇总中间值以确定每年的 gender/tot pop 的总数。
#test data
df<- structure(list(Yr = c(1901L, 1901L, 1901L, 1901L, 1901L, 1901L,
1901L, 1901L, 1902L, 1902L, 1902L, 1902L, 1902L, 1902L, 1902L, 1902L),
Gender = c("M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F"),
Number = c(100L, 105L, 23L, 87L, 102L, 103L, 42L, 67L, 100L, 105L, 23L, 87L, 102L, 103L, 42L, 67L),
Disease = c("A", "A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "B", "B", "B", "B"),
Age = c("1-5", "1-5", "6-10", "6-10", "1-5", "1-5", "6-10", "6-10", "1-5", "1-5", "6-10",
"6-10", "1-5", "1-5", "6-10", "6-10"),
Population = c(1500L, 1400L, 1300L, 1400L, 1500L, 1400L, 1300L, 1400L, 1000L, 1100L,
1200L, 1300L, 1000L, 1100L, 1200L, 1300L)),
class = "data.frame", row.names = c(NA, -16L))
library(dplyr)
#step 1 & step 2 (begins after the ungroup)
intermediate <- df %>% group_by(Yr,Gender, Age) %>%
summarize(Num= sum(Number), Pop = mean(Population)) %>%
ungroup() %>%
group_by(Yr) %>% mutate(YearPop = sum(Pop)) %>% ungroup()
#final step
answer <- intermediate1 %>% group_by(Yr, Gender) %>% summarize(rate = sum(Num) / mean(YearPop))
#final answer
Yr Gender rate
<int> <chr> <dbl>
1 1901 F 0.0646
2 1901 M 0.0477
3 1902 F 0.0787
4 1902 M 0.0580