今天一早上起来又扑到R上面写笨人的matlab课作业(悲),脑壳一整个晕晕……这份作业是我用R语言从CHIP数据库提取数据,做前期数据处理和变量计算,之后给同组的建模的同学,让她用matlab建模。

 重编码和变量筛选之后,数据大致是这个样子↑(文件:total2.csv)

        在拆分数据上面,遇到了困难。我要计算每个城镇的全口径社会平均工资,计算方法大致同加权平均数:

全口径社会平均工资 =  私营平均工资×(私营人口/全部人口)+非私营平均工资 ×(非私营人口/全部人口)

        这就需要分别求每个城镇的“私营平均工资”、“非私营平均工资”、“私营人口”、“非私营人口”、“全部人口”五个变量。因此需要两个分类,一个是城镇(living_site),一个是私营非私营(work_type2)。平均工资直接用mean,人口即行数nrow。

#先把total2中要用的变量挑出来
total2 <- read.csv("total2.csv")
total2 <- total2[,c(1,9,11,12)]
#按照私营非私营、住址两个标准进行拆分
#install.packages("dplyr")
library(dplyr)
w11_1 <- filter(total2,work_type2 == "私营"& livng_site == "11")
w11_2 <- filter(total2,work_type2 == "非私营"& livng_site == "11")
#计算加权平均数
mean_11 <- (mean(w11_1$wage)*nrow(w11_1)+mean(w11_2$wage)*nrow(w11_2))
            /(nrow(w11_1)+nrow(w11_2))

        R代码中的filter等效于excel中的if函数,和nrow一起用,则相当于“countif(range,"=私营")。

         并附上help中对filter函数的代码解释(大伙自己去help里搜一下更清楚咯):

         可知filter函数能够“把符合条件的行保留下来”,有四个参数:data是指导入的数据,可以是数据框、延展的数据框或者惰性数据框,第二个参数是指自己选定的条件,并且数据框的变量不用加$,因为它是被mask后的。第三个参数.by貌似是对tibble类型的数据框使用的,详细可以看dplyr包.by的解释,第四个函数我也没明白,暂且按下不表(如果能仔细看看源代码应该能明白?)。

正文到这里就结束了。

最后,把我最初的想法也附在后面示个众,看看有没有朋友和我一开始的思路一样的,因为一开始以为不能用两个分类标准来分类,所以略麻烦一些,最后的nrow貌似因为分类的缘故,还是值为NULL。如果有大佬出没可以帮我改改(期待脸

total2 <- read.csv("total2.csv")#读取数据
total2 <- total2[,c(1,9,11,12)]
library(Hmisc)
describe(total2)#看看数据长啥样

#法1:先把城镇分出来,再用lapply计算mean,最后加权的时候求个数
n_11 <- subset(total2,livng_site == 11)#把地址是11的从总数据集中提取出来,作为一个子集
mean_11 <- lapply(split(n_11$wage,n_11$work_type2),mean)#以私营、非私营为分类标准计算工资均值
#计算行数的时候nrow结果为NULL,nrow不能带条件
mean_11_t <- mean_11$私营*nrow(n_11$work_type2 == "私营")/nrow(n_11$work_type2)+
             mean_11$非私营*nrow(n_11$work_type2 == "非私营")/nrow(n_11$work_type2)

 一开始按地址分出的子数据集(部分):

加权平均mean_11_t只得到空数据:

是为砖,以求玉))) 

更多推荐

R语言中的countif——dplyr包中的filter函数和nrow