我有一些看起来像这样的数据:
id yearborn male educ
1 1960 1 3
1 1960 1 3
1 1960 1 3
2 1960 1 2
2 1960 1 2
2 1960 1 2
3 1960 1 1
3 1960 1 1
3 1960 1 1
4 1960 0 1
4 1960 0 1
4 1960 0 1
5 1960 0 2
5 1960 0 2
5 1960 0 2
6 1960 0 3
6 1960 0 3
6 1960 0 3
7 1960 0 2
7 1960 0 2
7 1960 0 2
8 1960 1 3
8 1960 1 3
8 1960 1 3
9 1961 1 2
9 1961 1 2
9 1961 1 2
10 1961 1 1
10 1961 1 1
10 1961 1 1
11 1961 1 1
11 1961 1 1
11 1961 1 1
12 1961 0 2
12 1961 0 2
12 1961 0 2
13 1961 0 3
13 1961 0 3
13 1961 0 3
14 1961 0 2
14 1961 0 2
14 1961 0 2
15 1961 0 1
15 1961 0 1
15 1961 0 1
16 1961 1 3
16 1961 1 3
16 1961 1 3
我想在数据框中创建一个新变量,其中包含每个人的出生年份和性别的教育分位数(通过对每年和年龄的个体进行排序来定义教育四分位数)。也就是说,我不想根据示例中的所有数据行找到“educ”的分位数,而是想通过两个分组变量计算分位数:分娩变量和男性变量。例如,当年初= 1960年和男性= 1时,“educ”的分位数。
一旦计算出这些值,我希望它们作为单个列附加到数据框中,比如说“educ_quant”应该等于:第一个四分位数,第二个四分位数,第三个四分位数,第四个四分位数。 / p>
我知道如何计算分位数和分组数据,但我遇到的问题是能够在现有数据框中创建新列。
我尝试过类似的东西,但这并不是我需要的东西:
library(dplyr)
df %>% group_by(id, yearborn, male) %>% mutate(percentile = percent_rank(educ) * 100)
library(data.table)
setDT(df)[,quantile := cut(educ, quantile(educ, probs = 0:4/4, na.rm=TRUE),
labels = FALSE, include.lowest = TRUE), by = c(id, yearborn, male)]
对于后者,我的问题是休息时间是非唯一的。
它应该最终看起来像这样(出生年份1960年):
id yearborn male educ educ_quant
1 1960 1 3 4th
1 1960 1 3 4th
1 1960 1 3 4th
2 1960 1 2 2nd
2 1960 1 2 2nd
2 1960 1 2 2nd
3 1960 1 1 1st
3 1960 1 1 1st
3 1960 1 1 1st
4 1960 0 1 1st
4 1960 0 1 1st
4 1960 0 1 1st
5 1960 0 2 3rd
5 1960 0 2 3rd
5 1960 0 2 3rd
6 1960 0 3 4th
6 1960 0 3 4th
6 1960 0 3 4th
7 1960 0 2 2nd
7 1960 0 2 2nd
7 1960 0 2 2nd
8 1960 1 3 3rd
8 1960 1 3 3rd
8 1960 1 3 3rd
每年应该有个人随机排序*年龄水平,应该定义四个教育四分位数。
一篇文章用这种方式描述:“因此,为了比较不同时期的类似人群,我们在出生年份内定义了”教育四分位数“ - 也就是说,将”最高技能“的四分之一组合在一起我们在一年中出生的人口,等等。我们分别为男性和女性定义这些四分位数,以便在男女教育机会方面存在时间差异。“