我有一个分组的数据结构(不同的家庭回答每周的民意调查(,我在52周内观察他们(在下面的例子中是四周(。现在我想用基尼系数来表示一个家庭在给定时间点的价值。在这种情况下,如果一个家庭在过去几周没有参加投票,那么参与投票的家庭的价值应该更高。因此,一个总是回答民意调查的家庭在一周内的基尼系数应该低于一个每4周回答一次的家庭。
数据结构如下:
da_poll <- data.frame(household = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), week = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4), participation = c(1,1,1,1,0,0,0,1,0,1,0,1,1,1,1,0))
da_poll
household week participation
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 2 1 0
6 2 2 0
7 2 3 0
8 2 4 1
9 3 1 0
10 3 2 1
11 3 3 0
12 3 4 1
13 4 1 1
14 4 2 1
15 4 3 1
16 4 4 0
1表示参与,0表示不参与。
这里有三种方法。它们都使用包DescTools
中的函数Gini
。
library(DescTools)
基本R
tapply(da_poll$participation, da_poll$household, Gini)
# 1 2 3 4
#0.0000000 1.0000000 0.6666667 0.3333333
或者,另一种基本R方式。
aggregate(participation ~ household, da_poll, Gini)
# household participation
#1 1 0.0000000
#2 2 1.0000000
#3 3 0.6666667
#4 4 0.3333333
dplyr
library(dplyr)
da_poll %>%
group_by(household) %>%
summarise(gini = Gini(participation))
## A tibble: 4 x 2
# household gini
# <dbl> <dbl>
#1 1 0
#2 2 1
#3 3 0.667
#4 4 0.333
编辑
要使原始数据集的每行具有一个Gini
系数值,而不是聚合,请使用tapply
和mutate
的ave
整数,而不是summarise
。
带基本R
da_poll$gini <- ave(da_poll$participation, da_poll$household, FUN = Gini)
dplyr
溶液
da_poll %>%
group_by(household) %>%
mutate(gini = Gini(participation))