代码之家  ›  专栏  ›  技术社区  ›  Abdel

R: 基于列值对子集应用函数

  •  0
  • Abdel  · 技术社区  · 6 年前

    我有一个名为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
    

    我想用 Gini 函数计算每个区域的基尼系数。如果我想为整个数据帧计算它,而不考虑区域,我将执行以下操作:

    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这样的东西可以做到这一点,但我不知道如何在函数中自动传递这些长度(我的实际数据帧要大得多,所以手动不是一个选项)。

    1 回复  |  直到 6 年前
        1
  •  1
  •   A. Suliman    6 年前

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