R data.frame汇总数据以计算分集比

时间:2018-08-29 05:43:47

标签: r dataframe

我在 R

中有一个人口统计数据的数据框
Name...Region...Gender

...A...........1.............F

...B...........2.............M

...C...........1.............F

...D...........1.............M

...E...........2.............M

我想计算每个地区的性别比例。输出应如下所示:

Region ..........GenderRatio

....  1........................(0.67)

....  2........................(0.50)

可以使用正常的BODMAS使用量来计算。有什么有效的方法可以在R中计算出来吗?

2 个答案:

答案 0 :(得分:0)

您可以将R中的dplyr库用于各种数据处理。请参阅here,以详细了解dplyr和其他非常有用的R包。

一个例子:

首先,我创建一些示例数据。 (我对其进行了一些更改,以使性别比例实际上适合您的输出。)

df <- data.frame(name = c("A", "B", "C", "D", "E"),
                 region = c(1,2,1,1,2),
                 gender = c("F", "M", "F", "M", "F"))

现在我们可以计算gender_ratio并汇总数据。函数mutate用于创建和计算新变量gender_ratiogroup_bysummarise函数用于在计算之前对数据进行逻辑组织(以region进行计算),之后仅输出汇总数据。

library(dplyr)                 
df %>% group_by(region) %>% mutate(gender_ratio = sum(gender == "F")/length(gender)) %>% group_by(region, gender_ratio) %>% summarise()

输出为:

  region gender_ratio
   <dbl>        <dbl>
1      1        0.667
2      2        0.5

希望这会有所帮助。

答案 1 :(得分:0)

作为一种替代方案(基数R),您可以将byprop.table(table(...))结合使用,以返回list的男性/女性分数

with(df, by(df, Region, function(x) prop.table(table(x$Gender))))
#Region: 1
#
#        F         M
#0.6666667 0.3333333
#------------------------------------------------------------
#Region: 2
#
#F M
#0 1

或者只返回男性分数

with(df, by(df, Region, function(x) prop.table(table(x$Gender))[2]))
#Region: 1
#[1] 0.3333333
#------------------------------------------------------------
#Region: 2
#[1] 1

或者仅将以上结果data.frame stack中存储男性分数和区域:

setNames(
    stack(with(df, by(df, Region, function(x) prop.table(table(x$Gender))[2]))),
    c("GenderRatio", "Region"))
#  GenderRatio Region
#1   0.3333333      1
#2   1.0000000      2