首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R中的频率表确定收入等级的中位数

使用R中的频率表确定收入等级的中位数
EN

Stack Overflow用户
提问于 2021-01-01 04:17:56
回答 3查看 55关注 0票数 0

我有如下所示的数据:

代码语言:javascript
运行
复制
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县的收入中位数,等等)。

任何指导或建议都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2021-01-01 04:37:57

像这样的东西可能会有帮助!

代码语言:javascript
运行
复制
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])
    }))
票数 1
EN

Stack Overflow用户

发布于 2021-01-01 08:19:40

我认为@TTL有一个很好的答案,如果很难读的话。这是另一个想法。

通常,您应该将像income_level这样的变量存储为有序因子。然后,您可以找到因子值的中位数。

要在这里找到中位数,您可以“扩展”数据集,以便每组中的观察值与frequency的值相匹配,并以正常方式找到中位数。

一个小问题是,基R没有定义一个方法来寻找有序因子的方法。标准方法是将因子转换为数字median(as.numeric(income_level)) (并丢失因子名称)。另一种是使用missMethods,它定义了一种寻找有序因子的中位数的方法。

基数R

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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))
代码语言:javascript
运行
复制
# # A tibble: 2 x 2
#   county_id income_level
#   <chr>     <ord>       
# 1 A         income4     
# 2 B         income2 
票数 1
EN

Stack Overflow用户

发布于 2021-01-01 12:35:25

您可以重复income_level frequency次数并计算median值。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65525236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档