在R中按年龄计算比例

机器算法验证 r 数据可视化
2022-03-25 06:08:45

我正在处理这个包含婚姻状况和年龄的数据集。我想绘制未婚男人与每个年龄的百分比。你能帮我弄清楚如何在R中做到这一点吗?到目前为止,我已经创建了两个单独的数组,其中包含从未结婚和结婚的男性。我知道我有多少箱。我需要做的是计算每个年龄段未婚的人数,然后将其除以未婚人数的总数以获得百分比。我希望我很清楚。谢谢

3个回答

你的方法对我来说似乎太复杂了。让我们从一些数据开始:

## 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- 它让我可以参考我已经创建的其他变量,这使得百分比、转换等更容易 - 如果我已经创建了numdenom,那么 的比例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如果您添加更多详细信息,我可以给您更深入的解释。