因此,我正在使用ENIGH-数据库,该数据库代表西班牙语的“家庭收入和支出的国家调查”,这是墨西哥政府进行的一项工作,与大多数此类调查一样,它也可以使用权重
我想做的是通过Decile计算家庭平均收入,最高收入和最低收入。换句话说,每10%的收入是多少,即根据他们的收入对家庭进行分组。 老实说,我还没走那么远,但这是我到目前为止得到的:
Map<String, Long> map = dummyString.chars() // Turn the String to an IntStream
.boxed() // Turn int to Integer to use Collectors.groupingBy
.collect(Collectors.groupingBy(
Character::toString, // Use the character as a key for the map
Collectors.counting())); // Count the occurrences
这里是棘手的地方,假设我有100行,我不能接受其中的前10行,因为实际上,考虑到权重,可能是9%或20%(我只是在扔数字)。
我可以在收入变量中使用ENIGH_design <-svydesign(id=~upm, strata=~est_dis, weights=~factor_hog, data = ENIGH)
ENIGH_table <- svytable(ing_cor, ENIGH_design)
,但我会忘记权重,结果将仅代表样本,而不代表总人口。
我认为最好的方法是使用以下组合:
cut()
创建一个新的变量库mutate()
与mutate共同定义每行落在哪个十分位上if()
和group_by()
来计算我的目标这样,我将拥有一个额外的变量,该变量可用于计算所需的任何其他变量。但是,我还没有定义我的组,所以这几乎没有用。
感谢您的阅读。谢谢您的帮助。
可用数据库:https://www.inegi.org.mx/programas/enigh/nc/2016/default.html#Datos_abiertos
以下是我数据库的外观:
mean()
还有更多的列,但对于本练习来说不是必需的。
答案 0 :(得分:0)
制作一个看起来像这样的表(dataframe,data.table或tibble):
> dt
folioviv factor ing_tri
1 247 30000
2 200 15000
3 150 50000
incomes <- rep(dt$ing_tri, times = dt$factor)
deciles <- quantile(incomes, probs = seq(0.1, 1, by = 0.1), names = TRUE)
如果我是你,我会尝试使用names = FALSE
使其可操作。否则,它将是一个命名列表,这有点烦人。
哦,要计算平均值,只需执行mean(incomes)
。
PS:folioviv
列实际上不是必需的,但您可能希望将其放在此以防万一。