使用 R 中的频率表确定收入等级的中位数
Posted
技术标签:
【中文标题】使用 R 中的频率表确定收入等级的中位数【英文标题】:identify median across income brackets using frequency table in R 【发布时间】:2021-04-08 00:51:51 【问题描述】:我的数据如下所示:
dat <- data.frame(county_id = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
income_level = c("income1", "income2", "income3", "income4",
"income5","income1", "income2", "income3", "income4", "income5"),
frequency = c(4, 1, 5, 11, 4, 7, 12, 0, 5, 7),
total = c(25, 25, 25, 25, 25, 31, 31, 31, 31, 31)
)
我想确定每个独特县的平均收入水平(在上面的代码中,有两个县,但我使用的实际数据集有数千个)。
例如,在 A 县,按升序排列时,中位数是第 13 个观测值。这意味着 A 县的中位数属于收入水平 4。
对于 B 县,中位数是第 16 个观测值,这意味着 B 县的收入水平中位数是收入水平 2。
我想使用某个版本的 for 循环、lapply 等来创建一个新列,该列将返回数据集中每个唯一县的收入中位数水平(例如,A 县的收入中位数、 B 县的收入中位数等)
任何指导或建议将不胜感激。
【问题讨论】:
【参考方案1】:这样的事情可能会有所帮助!
do.call(rbind.data.frame,lapply(unique(dat$county_id), function(x)
country<-dat[dat$county_id == x,'frequency']
cbind.data.frame(Country=x, median=which(cumsum(country)>ceiling(sum(country)/2))[1])
))
【讨论】:
【参考方案2】:我认为@TTL 有一个很好的答案,如果难以阅读的话。这是另一个想法。
一般来说,您应该将像income_level
这样的变量存储为有序因子。然后你可以找到因子值的中位数。
要在此处找到中位数,您可以“扩展”数据集,使每组中的观察数与 frequency
的值匹配,并以正常方式找到中位数。
一个小问题是基础 R 没有定义一种方法来查找有序因子的方法。标准方法是将因子转换为数字median(as.numeric(income_level))
(并丢失因子名称)。另一种是使用missMethods
,它定义了一种求有序因子中位数的方法。
基础 R
library(missMethods) # Defines median for ordered factor
dat$income_level <- factor(dat$income_level,
levels = paste0('income', 1:5),
ordered = TRUE)
# Expand dataset
dat_exp <- dat[rep(1:nrow(dat), dat$frequency), ]
# Calculate medians
with(dat_exp, aggregate(list(income_level = income_level),
by = list(county_id = county_id), FUN = median))
dplyr
library(missMethods)
library(dplyr)
# Make income_level an ordered factor
dat <- mutate(dat, income_level = factor(income_level, levels = paste0('income', 1:5),
ordered = TRUE))
# Expand and find medians
dat[rep(1:nrow(dat), dat$frequency), ] %>%
group_by(county_id) %>%
summarize(med_income_level = median(income_level))
# # A tibble: 2 x 2
# county_id income_level
# <chr> <ord>
# 1 A income4
# 2 B income2
【讨论】:
【参考方案3】:你可以重复income_level
frequency
次数并计算median
的值。
library(dplyr)
dat %>%
group_by(county_id) %>%
summarise(med = median(rep(income_level, frequency)))
# county_id med
# <chr> <chr>
#1 A income4
#2 B income2
【讨论】:
以上是关于使用 R 中的频率表确定收入等级的中位数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode:Database 16.给定数字的频率查询中位数