我有如下所示的数据:
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县的收入中位数,等等)。
任何指导或建议都将不胜感激。
发布于 2021-01-01 04:37:57
像这样的东西可能会有帮助!
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])
}))发布于 2021-01-01 08:19:40
我认为@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 发布于 2021-01-01 12:35:25
您可以重复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 income2https://stackoverflow.com/questions/65525236
复制相似问题