исключите наблюдения с тем же идентификатором, но фактически не соответствуют в r

Я использую национальный опрос для проведения эконометрического анализа в р.

Df основан на опросе, который проводится каждые два года: некоторые семьи опрашивались более одного раза, а другие появляются только один раз.

Семейство переменных представляет кодовый номер семейства, переменная nord-кодовый номер набора компонентов семейства за определенный год; переменная nordp представляет кодовый номер, который был у индивида в предыдущем опросе. Таким образом, когда индивидуумы скрещиваются более одного раза, nord и nordp shuold одинаковы, но на самом деле это не всегда верно.

Мне нужно фильтровать df, чтобы иметь только человека, который появляется по крайней мере один раз:

df <- df %>%
group_by(nquest, nordp) %>%
filter(n()>1)

Затем я назначаю уникальное значение идентификатора каждому человеку с помощью этой команды (в разные годы у меня есть тот же идентификатор для той же пары nquest и nord):

df <- transform(df, id=as.numerica(interaction(nquest, nord))

проблема в том, что когда-то данные были введены неправильно, так что в один год тот же человек (идентифицированный с тем же nquest и nordp) на самом деле не является одним и тем же человеком; например, посмотрите на две линии с **; у них те же nquest и nordp, и поэтому тот же id, но они не являются одним и тем же человеком (nord не тот же, а также пол отличается).

  year id nquest nord nordp sex
**2000  1     10    1     1   F**
  2000  2     20    1     1   M
  2000  3     30    1     1   M
  2002  1     10    1     1   F
  2002  2     20    1     1   M
  2002  4     40    1     1   F
**2004  1     10    2     1   M**
  2004  2     20    1     1   M
  2004  3     30    1     1   M

таким образом, моя проблема состоит в том, чтобы исключить наблюдения, которые на самом деле не одинаковы, используя пол в качестве переменной проверки; учтите, что df состоит из более чем 50k наблюдений, и поэтому я не могу проверить для каждого id.

Заранее спасибо

Метки

2 ответа

  1. Вы могли бы сделать

    unique_df <- unique(df[,c("id","nquest","nordp","sex")])
    unique_df$id[duplicated(df_unique$nquest)]
    

    Это возвращает идентификаторы с несколькими аннотациями разного пола.

  2. С summarise_eachи n_distinctот dplyr вы могли бы сделать:

    library("dplyr")
    
    DF=read.table(text="year id nquest nord nordp sex
    **2000  1     10    1     1   F**
      2000  2     20    1     1   M
      2000  3     30    1     1   M
      2002  1     10    1     1   F
      2002  2     20    1     1   M
      2002  4     40    1     1   F
    **2004  1     10    2     1   M**
      2004  2     20    1     1   M
      2004  3     30    1     1   M",header=TRUE,stringsAsFactors=FALSE)
    
    
    
    summaryDF= DF %>% 
               group_by(id) %>% 
               summarise_each(funs(n_distinct),everything(),-year,-id) %>% 
               filter(sex>1 & nord >1 & nquest==1 & nordp==1 ) %>%   #filter conditions on resultant data.frame
               as.data.frame()
    
    summaryDF
    # id nquest nord nordp sex
    #  1      1    2     1   3