这是我的示例数据帧(在R中): 假设我有这些人的年龄和身高。
age <-c(3.1,3.2,3.1,3.2,3.4,
4.1,4.4,4.5,4.6,4.1,
5.2,5.1,5.1,5.8,5.9,
6.3,6.1,6.2,6.2,6.6)
height <- c(1.1, 1.2, 1.0, 1.5, 1.2,
1.3, 1.3, 1.6, 1.2, 1.4,
1.4, 1.2, 1.7, 1.6, 1.5,
1.5, 1.4, 1.7, 1.6, 1.7)
df <- as.data.frame(cbind(age,height))
现在我计算分位数。
df$percentile <- with(df, cut(height, breaks = quantile(height,
probs= seq(0,1, by=0.25)),include.lowest=TRUE,
labels=c("p25","p50","p75","p100")))
现在,我有高度受年龄影响的问题。 我可以根据年龄将样本分成高度分位数吗?例如,年龄为1.5岁的人将处于较高的百分位数,即使这个人在年龄方面相当短暂(见情节)。
答案 0 :(得分:1)
您熟悉data.table包吗?它是一个使data.frames更易于使用的包。不幸的是,我不知道如何在不使用它的情况下回答您的问题。记住这一点,我认为这正是你要找的。 p>
require(data.table)
df<-data.table(age=runif(100,min=3,max=7))
df[,height:=rnorm(100, mean=.5+age/6, sd=age*.020)]
for(i in 3:6){
my.breaks=quantile(df[age>=i & age <i+1,]$height)
df[age>=i & age <i+1, new.percentile:=cut(height,breaks=my.breaks, include.lowest = TRUE,
labels=c("p25","p50","p75","p100"))]
}
在第一行,我们加载data.table包。然后我们创建一个新的玩具数据集,因为你的数据集太小而无法使用分位数来处理各个年龄段。所以这个data.table有100个观测值,其中年龄来自3到7的均匀分布。然后我们添加一个高度列,其中高度来自正态分布,其中均值和标准差是年龄的函数。这些参数只是任意选择,以获得看起来合理的东西。
接下来,我们制作一个for循环,我们只通过查看年龄列中的一年范围来查找我们的百分位数。然后,我们应用您的代码仅为落在该年龄范围内的数据标记高度百分位数。
这是for循环之后的一些data.table。这是你在找什么?
age height new.percentile
1: 3.826293 1.049781 p50
2: 3.903765 1.116287 p75
3: 3.931612 1.075756 p75
4: 3.940625 1.165758 p100
5: 4.191432 1.142972 p25
6: 4.211323 1.193299 p25
7: 4.298498 1.192850 p25
8: 4.794392 1.161370 p25
9: 4.839184 1.190125 p25
10: 5.086999 1.195572 p25