R:根据列值将函数应用于子集



我有一个名为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"one_answers"ams"?注意,Gini函数还需要向量的长度(对于三个区域,分别为4、3和3(。我怀疑像lapply这样的东西可以做到这一点,但我不知道如何在函数中自动传递这些长度(我的实际数据帧要大得多,所以手动不是一种选择(。

使用基本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)

相关内容

  • 没有找到相关文章

最新更新