使用 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_levelfrequency次数并计算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 中的频率表确定收入等级的中位数的主要内容,如果未能解决你的问题,请参考以下文章

请问怎么做频率分布直方图啊

R语言怎么按组距300编制频数表

LeetCode:Database 16.给定数字的频率查询中位数

大熊猫是否表现出错误的百分位数?

字节工程师薪资排世界第五,中位数43万美元,2021全球程序员收入报告出炉

R假设检验之莫德中位数检验(Mood‘s Median Test)