Использование условия в цикле for для создания уникального идентификатора панели - PullRequest
0 голосов
/ 23 октября 2018

У меня есть набор данных, который выглядит следующим образом:

# A tibble: 5,458 x 539
# Groups:   country, id1 [2,729]
   idstd   id2    xxx        id1         country  year 
   <dbl+>   <dbl> <dbl+lbl> <dbl+lbl>   <chr>   <dbl>
 1 445801   NA      NA       7          Albania  2009 
 2 542384 4616555 1163       7          Albania  2013 
 3 445802   NA      NA       8          Albania  2009 
 4 542386 4616355 1162       8          Albania  2013 
 5 445803   NA      NA      25          Albania  2009 
 6 542371 4616545 1161      25          Albania  2013 
 7 445804   NA      NA      30          Albania  2009 
 8 542152 4616556  475      30          Albania  2013
 9 445805   NA      NA      31          Albania  2009 
10 542392 4616542 1160      31          Albania  2013 

Данные представляют собой данные панели, но нет уникального идентификатора панели.Первые два наблюдения относятся, например, к респонденту № 7 из Албании, но номер 7 снова используется для других стран.id2 однако уникален.Поэтому я планирую скопировать id2 в запись NA соответствующего респондента.

Я написал следующий код:

for (i in 1:nrow(df)) {
if (df$id1[i]== df$id1[i+1] & df$country[i] == df$country[i+1]) {
df$id2[i] <- df$id2[i+1]
}}

, который дает следующую ошибку:

Error in if (df$id1[i] == df1$id1[i + 1] &  :  missing value where TRUE/FALSE needed

Однако, похоже, работает.Поскольку мой набор данных довольно большой, и я не очень опытный, я неохотно принимаю решение, которое я придумала, особенно когда оно дает ошибку.

Может ли кто-нибудь помочь мне объяснить эту ошибку?

Кроме того, есть ли более эффективный (например, data.table) и, возможно, безошибочный способ справиться с этим?

1 Ответ

0 голосов
/ 24 октября 2018

Не можете ли вы сделать что-то в этом направлении:

library(tidyverse)
df %>%
    group_by(country, id1) %>%
    mutate(uniqueId = id2 %>% discard(is.na) %>% unique) %>%
    ungroup()

Кроме того, исходя из вашего цикла, я считаю, что NA всегда находятся на расстоянии 1 строки от уникальных идентификаторов, поэтому вы также можете сделать:

df %>%
    mutate(id2Lag = lag(id2),
           uniqueId = ifelse(is.na(id2), id2Lag, id2) %>%
    select(-id2Lag)
...