Гнездовой диапазон лет, когда в R есть фиктивные переменные - PullRequest
0 голосов
/ 10 февраля 2020

Я работаю над набором данных, содержащим информацию о месте проживания и профессии людей. Первоначально он говорит, что кто-то проживает по адресу от года к году, например, с 1920 по 1925 год. Если человек переехал по этому адресу в 1920 году, существует фиктивная переменная со значением 1. Аналогично, если человек переехал с этого адреса в 1925 году также существует пустышка со значением 1.

Теперь проблема в том, что когда я открою «из года в год», будет значение 1 для всех наблюдения, как перемещенные, так и перемещенные, с 1920 по 1925 г.

Пример данных:

library(tidyr)
library(dplyr)

individual <- c('John Doe','Peter Gynn','Jolie Hope', 'Jolie Hope')
occupation <- c('banker', 'butcher', 'clerk', 'clerk')
first_obs <- c(1920, 1920, 1920, 1925)
last_obs <- c(1925, 1925, 1925, 1926)
moved_in <- c(1, 0, 1, 1)
moved_out <- c(0, 0, 1, 0)
address <- c('king street', 'market street', 'montgomery road', 'princes ave')


df <- data.frame(individual, occupation, address, first_obs, last_obs, moved_in, moved_out)

df$year <- mapply(seq,df$first_obs,df$last_obs,SIMPLIFY=FALSE)


new_df <- df %>% 
  unnest(year) %>% 
  select(-first_obs,-last_obs)

Как видите, кажется, что Jol ie Hope, например, перенес и уезжала из своего адреса каждый год между 1920 и 1925 годами, но она должна была приехать в 1920 году и уехать в 1925 году. Есть ли решение для этого?

Кроме того, у меня есть проблемы с дублированными значениями из-за того, что люди въезжают и уходят в одном и том же году. Например, Джол ie Хоуп выехал с Монгомери-роуд в 1925 году и переехал на Принсес-авеню в 1925 году. Я думаю, что лучшим решением было бы использовать только «перемещенный» ряд. Можно ли систематически удалять все «выдвинутые» строки, где есть дублированные значения?

1 Ответ

0 голосов
/ 10 февраля 2020

Мы можем group_by каждый individual и их address и назначить 1, если первый year, когда они въехали, и 1, чтобы продлиться year, когда они вышли.

library(dplyr)

df %>% 
  tidyr::unnest(year) %>% 
  select(-first_obs,-last_obs) %>%
  group_by(individual, address) %>%
  mutate(moved_in = if (any(moved_in == 1)) replace(moved_in, 
                    row_number() != 1, 0) else moved_in, 
         moved_out = if (any(moved_out == 1)) replace(moved_out, 
                     row_number() != n(), 0) else moved_out)

#   individual occupation address         moved_in moved_out  year
#   <fct>      <fct>      <fct>              <dbl>     <dbl> <int>
# 1 John Doe   banker     king street            1         0  1920
# 2 John Doe   banker     king street            0         0  1921
# 3 John Doe   banker     king street            0         0  1922
# 4 John Doe   banker     king street            0         0  1923
# 5 John Doe   banker     king street            0         0  1924
# 6 John Doe   banker     king street            0         0  1925
# 7 Peter Gynn butcher    market street          0         0  1920
# 8 Peter Gynn butcher    market street          0         0  1921
# 9 Peter Gynn butcher    market street          0         0  1922
#10 Peter Gynn butcher    market street          0         0  1923
#11 Peter Gynn butcher    market street          0         0  1924
#12 Peter Gynn butcher    market street          0         0  1925
#13 Jolie Hope clerk      montgomery road        1         0  1920
#14 Jolie Hope clerk      montgomery road        0         0  1921
#15 Jolie Hope clerk      montgomery road        0         0  1922
#16 Jolie Hope clerk      montgomery road        0         0  1923
#17 Jolie Hope clerk      montgomery road        0         0  1924
#18 Jolie Hope clerk      montgomery road        0         1  1925
#19 Jolie Hope clerk      princes ave            1         0  1925
#20 Jolie Hope clerk      princes ave            0         0  1926

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

...