首页 文章

从一个数据帧到另一个数据帧的条件随机匹配

提问于
浏览
1

我有两个数据帧 . 一个数据框( 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 是二进制"Male" / "Female" .

第二个数据框( 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 ...

我可以创建新变量,使 NAsOnly 中的 AgebandInhabitants 是相同的结构,用于匹配 . 但我仍然坚持如何匹配 . 我想做的 - 对于 Partners.Missing 中的每一行 - 是使用以下标准从 NAsOnly 随机抽样观察:

  • SEX 相反(因此 Partners.Missing 中的"Female"将与 NAsOnly 中的"Male"匹配)

  • "Female"合作伙伴(无论他们来自哪个数据框)与"Male"合作伙伴处于同一年龄段,或者年龄较小的合作伙伴

  • Inhabitants 的数量是完全匹配,因此来自5人家庭的"Female"将仅匹配来自5人家庭的"Male"(正确年龄段)
    RELATIONSHIP 中的

  • RELATIONSHIP 只能是"Partnered"("Non-partnered"和"Not elsewhere included"也是该数据框中的有效变量条目)* .

所以我想要一对一的比赛,我需要比赛是随机抽签而不是第一场比赛 . 这样做195次,每次观察一次 Partners.Missing ,以便他们的伴侣不再失踪 .

我也不能使用第一个或最后一个匹配,因为 NAsOnly 中可能有许多行根据我的标准匹配 - 它必须是随机抽取,否则每次从 NAsOnly 开始绘制相同的观察结果 . 基本上,像 NAsOnly 替换的随机抽样 . 采样观测是否用于构建匹配的第三个数据帧,或者采样的观测是否作为附加列添加到 Partners.Missing 无关紧要 .

*它有四个级别,因为原始较大的数据帧具有总计行,因此第四个(和未使用的)级别是“总计” .

更新:我已经尝试为下一个循环编写一个来执行此操作,但它没有按预期工作 . 代码是:

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)
   )
 }

这个输出单个柱到一个名为 matchedTRUEdata frame FALSE 如在277行的单一列的输入,表示该行的在 Partnered.Censored 索引是否为匹配或没有 . 一旦我将i的最大值增加到2(知道我有195行),我得到 NA 作为输出 . 我还有以下问题:

  • 我希望使用与 Partnered.Censored 匹配的行而不是输出布尔结果

  • 然后,我希望从匹配的行中随机抽样以生成新的合作伙伴

  • 然后重复 Partners.Missing 中的每一行 .

我还有一个问题,即增加 i 的最大值,例如到2,覆盖 TRUE/ FALSE values with NA`的单列 .

1 回答

  • 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 临时向量创建抱着那个人's information. A one-to-many join is constructed on the basis of the two variables that will match - the missing person'的性别,并在家庭居民的人数 . 然后,根据 Partners.Missing 中的人是女性还是男性,匹配的结果仅保留给具有正确年龄段的潜在合作伙伴 . 然后,代码定位已识别的潜在合作伙伴的数量,并生成1和该数字之间的随机整数 . 这用于提取随机匹配的人并将其放入输出数据框中 . 由于在运行此代码之前输出数据框( Matched.Partners )不存在,因此第一个循环将创建具有第一行的数据框 . 每隔一段时间,数据框已经存在,因此附加了新的匹配 .

    我不会对我的问题或答案进行投票 .

相关问题