2015-10-20 135 views
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等。InhabitantsV4的重新编码,再次构造数字变量。 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 ... 

我可以创建新的变量,以便在NAsOnlyAgebandInhabitants具有相同的结构,在匹配中使用。但我坚持如何配合。我想做的事 - 每个行Partners.Missing - 是随机NAsOnly使用下列标准样本的观察:

  • 相反SEX(这样一个“女”在Partners.MissingNAsOnly匹配到一个“男” )
  • 中的“女性”伙伴(无论哪个数据帧的它们起源)是在相同的年龄段,或一个年轻的,比“男性”伙伴
  • Inhabitants数为完全匹配,以使得来自5人家庭的“女性”只能与来自5人家庭的“男性”(正确的年龄段)匹配
  • NAsOnlyRELATIONSHIP只能是“合作”(“非结成伙伴的”和“不包括其他地方”,可以在该数据帧有效的变量条目)*。

所以我想要一对一的比赛,我需要比赛是一个随机抽签,而不是第一个可用。并且做这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) 
    ) 
} 

此输出单个柱成data frame称为matchedTRUEFALSE如在277行的单一列的输入,表示该行的在Partnered.Censored索引是否为匹配或没有。一旦我把i的最大值增加到2(知道我有195行),我得到NA作为输出。我有剩余存在以下问题:

  • 我希望用行(S),从Partnered.Censored匹配,而不是输出一个布尔结果
  • 我则想从匹配的行随机抽样产生的新的合作伙伴
  • 然后重复为Partners.Missing中的每一行。

我也有问题在哪里增加最大值i,例如,到2,将覆盖TRUE/ FALSE values with NA`的单列。

回答

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)不存在,因此第一个循环将在其第一行中创建数据帧。每隔一段时间,数据帧就已经存在,所以新的匹配被追加。

我不投了无论是我的问题还是我的答案。

相关问题