我需要通过 3 个变量(性别、部门和职业)计算加权中位年龄。我知道如何使用“spatstat”加权中位数。但它给出了整个 DF 的加权年龄。我不知道如何让它按组/变量进行计算。我在两年前发现了另一篇类似的帖子,但我不明白其中提供的解决方案。我确实知道您需要使用 dplyr 对其进行分组。我对图书馆的了解非常有限。我需要有人向我展示以下 DF 的代码,以便我可以使用它并在将来需要时对其进行一些小的更改。
我的DF如下:原来的DF更大,部门和职业也更多。但结构是一样的。
性别 行业 职业 年龄 体重 中标 1 45 13.12 足球俱乐部 1 23 7.05 中号 3 67 34.12 硕士 3 23 11.00 足球俱乐部 1 33 17.45 FA 1 35 45.01 足球 3 57 21.45 中号 1 32 23.33 FA 3 48 44.54 中标 1 25 13.12 足球俱乐部 1 27 7.05 中号 3 37 34.12 硕士 3 26 11.00 足球 1 73 17.45 FA 1 49 45.01 足球 3 24 21.45 中号 1 25 23.33 FA 3 35 44.54 中标 1 48 13.12 足球 1 83 7.05 中号 3 66 34.12 硕士 3 43 11.00 足球 1 36 17.45 FA 1 35 45.01 足球俱乐部 3 57 21.45 中号 1 22 23.33 FA 3 47 44.54 中标 1 55 13.12 足球俱乐部 1 28 7.05 中号 3 27 34.12 硕士 3 25 11.00 足球俱乐部 1 23 17.45 FA 1 46 45.01 足球 3 34 21.45 中号 1 27 23.33 FA 3 65 44.54
这就是我需要的结果。注意!这里的平均年龄是假的。它仅代表最终结果的结构。
性别 行业 职业 年龄中位数 硕士 1 23 硕士 3 34 中号 1 45 中号 3 23 FA 1 34 FA 3 45 足球俱乐部 1 43 足球俱乐部 3 34
我发现的问题(上面提到的)我不理解它,因为我不理解 mutate 并且示例中的数据以我无法阅读的方式呈现。我是 R 新手
weighted.median
包中有一个 spatstat
。 我们可以将其与 tidyverse
方法一起使用,即按“性别”、“部门”和“职业”分组,在 weighted.median
中应用 x
,其中 w
作为“年龄”,summarise
作为“体重” .
在链接的帖子中,它使用
mutate
创建新列,而 summarise
返回汇总输出,即每组一行。
此外,我们在使用
summarise/mutate
时应该小心,因为这些函数也可以在 plyr
中找到,如果加载了两个包,即使用 dplyr
中的屏蔽函数,它可能会屏蔽 plyr
函数,那么它可能会返回整个数据的weighted.median
,而不是分组。 因此,要么仅加载 dplyr
要么显式使用 dplyr::summarise
library(dplyr)
library(spatstat)
df1 %>%
group_by(Gender, Sector, occupation) %>%
dplyr::summarise(MedianAge = weighted.median(Age, Weight),
.groups = 'drop')
-输出
# A tibble: 7 x 4
Gender Sector occupation MedianAge
<chr> <chr> <int> <dbl>
1 F A 1 35
2 F A 3 47
3 F C 1 31.0
4 F C 3 34
5 M A 1 45
6 M A 3 33.8
7 M C 1 25
df1 <- structure(list(Gender = c("M", "F", "M", "M", "F", "F", "F",
"M", "F", "M", "F", "M", "M", "F", "F", "F", "M", "F", "M", "F",
"M", "M", "F", "F", "F", "M", "F", "M", "F", "M", "M", "F", "F",
"F", "M", "F"), Sector = c("A", "C", "A", "A", "C", "A", "C",
"C", "A", "A", "C", "A", "A", "C", "A", "C", "C", "A", "A", "C",
"A", "A", "C", "A", "C", "C", "A", "A", "C", "A", "A", "C", "A",
"C", "C", "A"), occupation = c(1L, 1L, 3L, 3L, 1L, 1L, 3L, 1L,
3L, 1L, 1L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 1L, 1L, 3L, 3L, 1L, 1L,
3L, 1L, 3L, 1L, 1L, 3L, 3L, 1L, 1L, 3L, 1L, 3L), Age = c(45L,
23L, 67L, 23L, 33L, 35L, 57L, 32L, 48L, 25L, 27L, 37L, 26L, 73L,
49L, 24L, 25L, 35L, 48L, 83L, 66L, 43L, 36L, 35L, 57L, 22L, 47L,
55L, 28L, 27L, 25L, 23L, 46L, 34L, 27L, 65L), Weight = c(13.12,
7.05, 34.12, 11, 17.45, 45.01, 21.45, 23.33, 44.54, 13.12, 7.05,
34.12, 11, 17.45, 45.01, 21.45, 23.33, 44.54, 13.12, 7.05, 34.12,
11, 17.45, 45.01, 21.45, 23.33, 44.54, 13.12, 7.05, 34.12, 11,
17.45, 45.01, 21.45, 23.33, 44.54)), class = "data.frame", row.names = c(NA,
-36L))
请参阅我的答案此处,以获取使用
collapse::fmedian()
的快速解决方案。