我有两个数据框。一个数据框(Partners.Missing
)包含195个合作伙伴(已婚,事实上等),我需要使用第二个数据框(NAsOnly
)中的随机选择来构建合作伙伴。
Partners.Missing
数据框信息是:
str(Partners.Missing)
'data.frame': 195 obs. of 8 variables:
$ V1 : Factor w/ 2 levels "Female","Male": 1 1 1 2 1 1 1 2 2 2 ...
$ V2 : Factor w/ 9 levels "15 - 17 Years",..: 4 4 7 7 4 4 7 3 7 4 ...
$ V3 : Factor w/ 1 level "Partnered": 1 1 1 1 1 1 1 1 1 1 ...
$ V4 : Factor w/ 7 levels "Eight or More Usual Residents",..: 1 1 5 2 1 1 1 1 2 5 ...
$ V5 : Factor w/ 8 levels "1-9 Hours Worked",..: 8 4 8 6 7 8 7 5 4 6 ...
$ SEX : chr "Male" "Male" "Male" "Female" ...
$ Ageband : num 4 4 7 7 4 4 7 3 7 4 ...
$ Inhabitants: num 8 8 6 5 8 8 8 8 5 6 ...
因为V2是年龄段的因素,我创建了Ageband
变量,它是V2
的重新编码,以便最年轻的年龄组(15 - 17岁)为1,下一个最老的是2,等等。Inhabitants
是V4
的重新编码,再次构造一个数字变量。 Sex
是二进制“男性”/“女性”。
第二个数据框(NAsOnly
)的信息是:
str(NAsOnly)
'data.frame': 762 obs. of 7 variables:
$ SEX : Factor w/ 3 levels "Female","Male",..: 2 2 2 2 2 2 2 2 2 2 ...
$ AGEBAND : Factor w/ 13 levels "0 - 4 Years",..: 3 3 3 3 3 3 3 3 3 3 ...
$ RELATIONSHIP: Factor w/ 4 levels "Non-partnered",..: 3 3 3 3 1 1 1 1 1 1 ...
$ INHABITANTS : Factor w/ 9 levels "Eight or More Usual Residents",..: 7 7 3 2 9 9 9 9 7 7 ...
$ HRSWORKED : Factor w/ 9 levels "1-9 Hours Worked",..: 1 8 6 3 1 2 3 6 3 4 ...
我可以创建新变量,以便Ageband
中的Inhabitants
和NAsOnly
具有相同的结构,用于匹配。但我仍然坚持如何匹配。我想做的事情 - 对于Partners.Missing
中的每一行 - 是使用以下标准从NAsOnly
随机抽样观察:
SEX
对面(Partners.Missing
中的“女性”与NAsOnly
中的“男性”匹配)Inhabitants
的数量完全匹配,因此来自5人家庭的“女性”只会与来自5人家庭的“男性”(正确年龄段)相匹配< / LI>
RELATIONSHIP
中的NAsOnly
只能是“合作伙伴”(“非合作”和“其他地方不包含”也是该数据框中的有效变量条目)*。所以我想要一对一的比赛,我需要比赛是随机抽签而不是第一场比赛。这样做195次,Partners.Missing
中每次观察一次,以便他们的伴侣不再失踪。
我也不能使用第一个或最后一个匹配,因为NAsOnly
中可能有许多行根据我的标准匹配 - 它必须是随机抽取,否则相同的观察将被绘制每次都来自NAsOnly
。基本上,像NAsOnly
替换的随机抽样。采样观测是否用于构建匹配的第三个数据帧,或者是否将采样的观测值作为附加列添加到Partners.Missing
无关紧要。
*它有四个级别,因为原始较大的数据框具有Totals行,因此第四个(和未使用的)级别为“Total”。
更新: 我试图写一个for next循环来做这件事,但它没有按预期工作。代码是:
for(i in 1:1) {
row <- Partners.Missing[i,]
if(row$V1=="Female")
matched <- data.frame(row$SEX[i]==Partnered.Censored$SEX &
row$Inhabitants[i]==Partnered.Censored$Inhabitants &
(row$Ageband[i]==Partnered.Censored$Ageband | row$Ageband[i]==Partnered.Censored$Ageband+1)
)
else
matched <- data.frame(row$SEX[i]==Partnered.Censored$SEX &
row$Inhabitants[i]==Partnered.Censored$Inhabitants &
(row$Ageband[i]==Partnered.Censored$Ageband | row$Ageband[i]==Partnered.Censored$Ageband-1)
)
}
这会将单个列输出到名为data frame
的{{1}},matched
或TRUE
作为277行的单个列中的输入,表示该行的索引是否为FALSE
是否匹配。一旦我将i的最大值增加到2(知道我有195行),我得到Partnered.Censored
作为输出。我还有以下问题:
NA
匹配的行而不是输出布尔结果Partnered.Censored
中的每一行。我也遇到了增加Partners.Missing
最大值的问题,例如到2,覆盖i
FALSE TRUE/
NA`的单列。
答案 0 :(得分:0)
在过去的几天里,这一直是我的首要考虑,我似乎已经使用以下代码解决了这个问题。我要离开这个问题并回答,以防万一其他人需要这样做。
for(i in 1:nrow(Partners.Missing)) {
row <- Partners.Missing[i,]
result <- merge(row, Partnered.Censored, by=c("SEX","Inhabitants"),suffixes=c(".r",".c"))
if (row$V1=="Female") {
result<- subset(result, Ageband.r==Ageband.c | Ageband.r==Ageband.c-1)
}
if (row$V1=="Male") {
result<- subset(result, Ageband.r==Ageband.c | Ageband.r==Ageband.c+1)
}
j <- sample(1:nrow(result),1)
if(i == 1) {
Matched.Partners <- result[j,]
}
if (i > 1) {
Matched.Partners <- rbind(Matched.Partners,result[j,])
}
}
向需要此答案的任何人解释此代码,并了解社区是否有更好的答案,
对于Partners.Missing
中的每个人,都会创建一个包含该人信息的临时矢量。基于两个将匹配的变量 - 失踪者的性别和家庭中的居民数量 - 构建一对多联接。然后,根据Partners.Missing
中的人是女性还是男性,匹配的结果仅保留给具有正确年龄段的潜在合作伙伴。然后,代码定位已识别的潜在合作伙伴的数量,并生成1和该数字之间的随机整数。这用于提取随机匹配的人并将其放入输出数据框中。由于在运行此代码之前输出数据框(Matched.Partners
)不存在,因此第一个循环将创建具有第一行的数据框。每隔一段时间,数据框已经存在,因此附加了新的匹配。
我不会对我的问题或答案进行投票。