我在 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中计算出来吗?
答案 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_ratio
。 group_by
和summarise
函数用于在计算之前对数据进行逻辑组织(以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),您可以将by
与prop.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