问题描述
我有一个家庭数据集data
,每个家庭都由变量id
标识,每个人都由id + num
标识(家庭编号+家庭成员)。对于每个人,我都有各种人口统计特征,例如:
id num age wage edu marital_status
1 1 33 1200 Secondary Married/Cohabitating
1 2 35 1100 College Married/Cohabitating
1 3 12 -1 Not applicable Not applicable
2 1 27 1600 College Single
3 1 59 2000 Secondary Married/Cohabitating
3 2 51 1800 Other Married/Cohabitating
我创建了一组变量,用于记录家庭另一成员的特征。
因此,例如,我想为有两个已婚或同居成人的家庭提供一个“伴侣工资” wage_p
的变量,该变量是通过
sums = tapply(data$wage,data$id,sum)
data$wage_tot = sums[match(data$id,names(sums))]
data$wage_tot[!(data$id %in% data$id[duplicated(data$id)])] = NA
data$wage_p = data$wage_tot - data$wage
基本上,我将每个家庭的wage
相加得出wage_tot
,然后减去wage
得到wage_p.
之所以工作,是因为我首先将数据集限制为已婚或同居的个人(所以我每个家庭只有1或2个人)。 (我知道这可能比必要的要复杂得多。)
我的结果:
id num age wage edu marital_status wage_tot wage_p
1 1 33 1200 Secondary Married/Cohabitating 2300 1100
1 2 35 1100 College Married/Cohabitating 2300 1200
2 1 27 1600 College Single NA NA
3 1 59 2000 Secondary Married/Cohabitating 3800 1800
3 2 51 1800 Other Married/Cohabitating 3800 2000
现在,当我要使用分类变量执行此操作时,问题就来了,因为我无法像求连续变量一样求和,然后求和。
例如,如果我要创建一个记录配偶受教育程度的变量edu_p
。
id num age wage edu marital_status edu_p
1 1 33 1200 Secondary Married/Cohabitating College
1 2 35 1100 College Married/Cohabitating Secondary
2 1 27 1600 College Single NA
3 1 59 2000 Secondary Married/Cohabitating Other
3 2 51 1800 Other Married/Cohabitating Secondary
我能想到的唯一想法是将分类变量转换为数字,使用我的方法,然后再次对其进行转换,但是我敢肯定,它必须要复杂得多。
有人可以帮我吗?
解决方法
请考虑一个merge
解决方案,以使用id
将每对夫妇进行比较。最终的左联接merge
过去曾包含原始数据的非耦合观测值。
spouse_merge <- subset(merge(data,data,by="id",suffixes=c("","_p")),(num < num_p | num > num_p) &
marital_status != "Not applicable" &
marital_status_p != "Not applicable")
final_df <- merge(data,spouse_merge[c(1,2,grep("_p",names(spouse_merge)))],by=c("id","num"),all.x=TRUE)
final_df