Вектор на согласованном парном идентификаторе в разных строках - PullRequest
0 голосов
/ 28 ноября 2018

Я хотел бы создать вектор, который идентифицирует строки с совпадающим идентификатором.Например, hldid - это идентификатор домашнего хозяйства, persid - персональный идентификатор, а partner id - соответствующий идентификатор.

Я хотел бы создать вектор couple, когда persid имеет partner.

       hldid persid partner_id age sex child
1     243312      2         91  20   2     0
2     243312     91          2  29   1     0
3     103340      0          0   6   1     2
4     103340      2         91  39   2     2
5     103340      4          0  14   2     2
6     103340     91          2  42   1     2
7    1105347      2          0  25   2     2
8    1105347      3          3  50   2     2
9    1105347     91          0  25   1     2
10 110322323      3          0  15   2     1
11 110322323     10          0  15   2     1

Это даст

       hldid persid partner_id age sex child couple
1     243312      2         91  20   2     0      1
2     243312     91          2  29   1     0      1
3     103340      0          0   6   1     2      0
4     103340      2         91  39   2     2      1
5     103340      4          0  14   2     2      0
6     103340     91          2  42   1     2      1
7    1105347      2          0  25   2     2      0 
8    1105347      3          3  50   2     2      0
9    1105347     91          0  25   1     2      0
10 110322323      3          0  15   2     1      0
11 110322323     10          0  15   2     1      0

Я создал loop, такой как

df$couple = 0

 for(i in 1:nrow(df)){
    if(
      df$hldid[i] == df$hldid[i+1] &
    (df$persid[i] == df$partner_id[i+1])
    )
    {
      df$couple[i] = 1
      df$couple[i+1] = 1
    }
  }
}

Однако, он не работает должным образом, когда идентификаторы не следующиедруг другу.

df = structure(list(hldid = c(243312L, 243312L, 103340L, 103340L, 
103340L, 103340L, 1105347L, 1105347L, 1105347L, 110322323L, 110322323L
), persid = c(2L, 91L, 0L, 2L, 4L, 91L, 2L, 3L, 91L, 3L, 10L), 
partner_id = c(91, 2, 0, 91, 0, 2, 0, 3, 0, 0, 0), age = c(20L, 
29L, 6L, 39L, 14L, 42L, 25L, 50L, 25L, 15L, 15L), sex = c(2L, 
1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L), child = c(0, 0, 
2, 2, 2, 2, 2, 2, 2, 1, 1)), class = "data.frame", row.names = c(NA, 
-11L), .internal.selfref = <pointer: 0x10280b2e0>)

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

С простым основанием R,

tmp  <- df1[,c("persid", "partner_id")]
tmp2 <- t(apply(tmp, 1, sort))
tmp2 <- unique( tmp2[duplicated(tmp2),] )

df1$couple <-
as.integer(apply( tmp, 1, function(x) { all(x %in% tmp2)}))

#       hldid persid partner_id age sex child couple
#1     243312      2         91  20   2     0      1
#2     243312     91          2  29   1     0      1
#3     103340      0          0   6   1     2      0
#4     103340      2         91  39   2     2      1
#5     103340      4          0  14   2     2      0
#6     103340     91          2  42   1     2      1
#7    1105347      2          0  25   2     2      0
#8    1105347      3          3  50   2     2      0
#9    1105347     91          0  25   1     2      0
#10 110322323      3          0  15   2     1      0
#11 110322323     10          0  15   2     1      0
0 голосов
/ 29 ноября 2018

Думаю, проблема в том, что вы не задумывались над логикой, что именно означает couple.Глядя на желаемый результат, мне кажется, что любая строка с partner_id, которая не равна 0 и не равна persid, получает 1, все остальные строки получают 0. Это простое условие, и его легко реализовать:

df$couple = with(df, ifelse(partner_id != 0 & partner_id != persid, 1, 0))
0 голосов
/ 28 ноября 2018

За @ комментарии Грегора, я не совсем уверен, что следую логике партнеров, которые должны быть в последовательных строках.Мне кажется, что это можно решить с помощью объединения:

library(data.table)
setDT(df)
merge(df, df, by = )

df[df,
   .(i.hldid, i.persid, i.partner_id, i.age, i.sex, i.child,
     couple = ifelse(is.na(child) | i.partner_id == 0 | i.partner_id == i.persid, 0, 1)),
   on = c("hldid", "persid==partner_id")]

      i.hldid i.persid i.partner_id i.age i.sex i.child couple
 1:    243312        2           91    20     2       0      1
 2:    243312       91            2    29     1       0      1
 3:    103340        0            0     6     1       2      0
 4:    103340        2           91    39     2       2      1
 5:    103340        4            0    14     2       2      0
 6:    103340       91            2    42     1       2      1
 7:   1105347        2            0    25     2       2      0
 8:   1105347        3            3    50     2       2      0
 9:   1105347       91            0    25     1       2      0
10: 110322323        3            0    15     2       1      0
11: 110322323       10            0    15     2       1      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...