我正在处理这个包含婚姻状况和年龄的数据集。我想绘制未婚男人与每个年龄的百分比。你能帮我弄清楚如何在R中做到这一点吗?到目前为止,我已经创建了两个单独的数组,其中包含从未结婚和结婚的男性。我知道我有多少箱。我需要做的是计算每个年龄段未婚的人数,然后将其除以未婚人数的总数以获得百分比。我希望我很清楚。谢谢
在R中按年龄计算比例
你的方法对我来说似乎太复杂了。让我们从一些数据开始:
## make up some data
status <- factor(rbinom(1000, 1, 0.3), labels = c("single", "married"))
age <- sample(20:50, 1000, replace = TRUE)
df <- data.frame(status, age)
head(df)
打印前六个案例:
> head(df)
status age
1 married 21
2 single 50
3 single 43
4 single 28
5 married 28
6 single 40
接下来,我们需要计算逐行百分比;即使我怀疑这是否有道理(它指的是你的陈述:“我需要做的是计算每个年龄段未婚的人数,然后将其除以未婚人数的总数以获得百分比。 ”)。
## calculate row wise percentages (is that what you are looking for?)
(tab <- prop.table(table(df), 1)*100)
结果表如下所示:
> (tab <- prop.table(table(df), 1)*100)
age
status 20 21 22 23 24 25 26
single 1.857143 3.142857 3.428571 2.285714 2.142857 2.857143 3.428571
married 2.333333 2.333333 5.666667 1.333333 3.333333 5.333333 2.000000
age
status 27 28 29 30 31 32 33
single 2.857143 3.142857 3.428571 3.285714 2.714286 3.714286 3.571429
married 5.000000 4.333333 2.666667 4.000000 1.666667 4.666667 3.000000
age
status 34 35 36 37 38 39 40
single 3.000000 2.857143 5.000000 3.571429 2.857143 3.571429 3.000000
married 3.333333 4.000000 4.000000 2.333333 2.000000 2.000000 2.000000
age
status 41 42 43 44 45 46 47
single 4.285714 3.000000 3.714286 3.857143 2.857143 3.714286 1.714286
married 2.333333 3.333333 2.000000 4.333333 3.666667 5.333333 2.666667
age
status 48 49 50
single 2.857143 3.428571 4.857143
married 2.333333 3.000000 3.666667
也就是说,如果你按行总结,它会给出 100%
> sum(tab[1,])
[1] 100
最后,绘制它。
## plot it
plot(as.numeric(dimnames(tab)$age), tab[1,],
xlab = "Age", ylab = "Single [%]")

我最近做了类似的事情。有很多方法可以在 R 中聚合这样的数据,但是ddply包中的函数plyr是我的安全毯,我求助于它来处理这样的事情。
我假设您对数据集中的每个人都有单独的记录,包括年龄、性别和婚姻状况。对于这种方法,无需将数据拆分为多个表 - 如果您在原始表中有女性,只需将她们保留并添加性别作为分组变量。
require(plyr)
results.by.age <- ddply(.data = yourdata, .var = c("sex", "age"), .fun = function(x) {
data.frame(n = nrow(x),
ever.married.n = nrow(subset(x, marital.status %in%
c("Married", "Divorced"))),
ever.married.prop = nrow(subset(x, marital.status %in%
c("Married", "Divorced"))) / nrow(x)
)
}
)
这通过变量和yourdata的唯一组合拆分 data.frame 。然后,对于这些块中的每一个(称为),它会计算属于该组的人数(),其中有多少已婚(),以及已婚的比例()。然后它将返回一个 data.frame 调用的行如sexagexnever.married.never.married.propresults.by.age
sex age n ever.married.n ever.married.prop
"Male" 25 264 167 0.633
这可能不是最优雅或最有效的方法,但这种通用模式对我很有帮助。这样做的一个优点是您可以轻松透明地从子集中收集任何您想要的统计数据,如果您想在图中添加一条回归线(权重为n)或同时显示男性和女性的比例,这将很有帮助相同的情节并按性别对点进行着色。
summarise()这是使用plyr 函数的修订版- 效果相同,但summarise()有几个关键优势: - 它在当前子集的环境中工作 - 所以x$marital.status我可以键入 ,而不是键入marital.status。- 它让我可以参考我已经创建的其他变量,这使得百分比、转换等更容易 - 如果我已经创建了num和denom,那么 的比例num就是num / denom。
results.by.age <- ddply(.data = yourdata, .var = c("sex", "age"), .fun = summarise,
n = length(marital.status),
ever.married = sum(marital.status %in% c("Married", "Divorced")),
ever.married.prop = ever.married / n # Referring to vars I just created
)
可能您需要的是tableor aggregate。如果您添加更多详细信息,我可以给您更深入的解释。