[英]R: apply function to subsets based on column value
我有一个名为Income.df的数据框,看起来像这样:
ID region income
1 rot 3700
2 ams 2500
3 utr 3300
4 utr 5300
5 utr 4400
6 ams 3100
8 ams 3000
9 rot 4000
10 rot 4400
12 rot 2000
我想使用基尼函数来计算每个区域的基尼系数。 如果要在不考虑区域的情况下针对整个数据帧进行计算,则可以执行以下操作:
library(DescTools)
Gini(income.df$income, n = rep(1, length(income.df$income)), unbiased = TRUE, conf.level = NA, R = 1000, type = "bca", na.rm = TRUE)
有没有办法针对数据框内的每个区域执行此操作? 那么在这种情况下,“ rot”,“ utr”和“ ams”呢? 请注意,Gini函数还需要其中的向量长度(三个区域分别为4、3和3)。 我怀疑类似lapply的方法可以做到这一点,但是我无法弄清楚如何在函数中自动传递这些长度(我的实际数据帧要大得多,因此不能手动选择)。
使用Base R:
library(DescTools)
lapply(split(df,df$region),
function(x) (Gini(x$income, n = rep(1, length(x$income)), unbiased = TRUE,
conf.level = NA, R = 1000, type = "bca", na.rm = TRUE)))
使用tidyverse:
library(tidyverse)
library(DescTools)
df %>% group_by(region) %>% nest() %>%
mutate(gini_coef = map(data, ~Gini(.x$income, n = rep(1, length(.x$income)),
unbiased = TRUE, conf.level = NA, R = 1000, type = "bca", na.rm = TRUE))) %>%
select(-data) %>% unnest() %>% left_join(df)
Joining, by = "region"
# A tibble: 10 x 4
region gini_coef ID income
<fct> <dbl> <int> <int>
1 rot 0.177 1 3700
2 rot 0.177 9 4000
3 rot 0.177 10 4400
4 rot 0.177 12 2000
5 ams 0.0698 2 2500
6 ams 0.0698 6 3100
7 ams 0.0698 8 3000
8 utr 0.154 3 3300
9 utr 0.154 4 5300
10 utr 0.154 5 4400
df <- read.table(text="
ID region income
1 rot 3700
2 ams 2500
3 utr 3300
4 utr 5300
5 utr 4400
6 ams 3100
8 ams 3000
9 rot 4000
10 rot 4400
12 rot 2000
",header=T)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.