Выявление изменений в собственности в R - PullRequest
1 голос
/ 03 февраля 2020

Мой набор данных состоит из идентификаторов жилой недвижимости и их владельцев за эти годы. Существует колонка для года, собственности, владельца 1 и владельца 2.

Иногда владельцы полностью меняются в разные годы, например, когда кто-то продает свою собственность кому-то другому.

Однако иногда владелец 1 остается прежним, но добавляется владелец 2 (например, совместное владение из-за брака. В других случаях владелец 1 остается прежним, но владелец 2 удаляется (например, развод, приводящий к совместной собственности) больше не существует).

Я хочу go через всех владельцев для одного свойства и определить случаи, когда владелец 1 остается прежним и добавляется владелец 2.

Аналогично, Я хочу go через всех владельцев для одного свойства в разные годы и определить случаи, когда владелец 1 остается прежним, но владелец 2 исключается из права собственности на имущество.

Любые рекомендации относительно того, что будет работа?

# owner added or removed
add_remove <- indiv_data %>%
  group_by(property) %>%
  mutate(added_removed = ifelse(Owner2 != dplyr::lag(Owner2), 1, 0))

Я новичок в R и пробовал приведенный выше код, но понимаю, что он не выполняет то, чего я хочу достичь. В идеале результатом является добавление к набору данных, которое определяет, нет ли изменений (0), добавлено (1) или удалено (2).

1 Ответ

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

Без примеров данных это своего рода удар в темноте, но я попробую! Создание некоторых фиктивных данных в соответствии с вашим описанием.

library(dplyr, warn.conflicts = FALSE)
owner_df <-
  purrr::map_dfr(1:5, ~ {
    owner1_names <-
      do.call(paste0, replicate(5, sample(LETTERS, 3, TRUE), FALSE))
    owner2_names <-
      do.call(paste0, replicate(5, sample(LETTERS, 1, TRUE), FALSE))
    tibble(
      property = .,
      year = 2000:2019,
      owner1 = sort(sample(owner1_names, 20, replace = TRUE)),
      owner2 = sample(
        c("-empty-", owner2_names), 20, replace = TRUE
      )
    )
  })

Как прокомментировал akrun, dplyr :: lag () здесь полезен для обнаружения изменений в переменной owner2. Всякий раз, когда owner2 и owner2_lag не совпадают, происходит изменение. Чтобы обнаруживать изменения только тогда, когда владелец 1 остается прежним, а владелец 2 меняется, мы включаем владельца 1 в группировку и создаем логическую переменную для каждого типа изменений, которые могут произойти (брак, развод и третья ситуация, когда партнер является поменяйте местами на другую).

owner_df %>%
  group_by(property, owner1) %>%
  mutate(
    owner2_lagged = lag(owner2, default = first(owner2)),
    change_detected = owner2 != owner2_lagged,
    marriage = change_detected & owner2_lagged == "-empty-",
    divorce = change_detected & owner2 == "-empty-",
    partner_swap = change_detected &
      owner2_lagged != "-empty-" & owner2 != "-empty-"
  )
#> # A tibble: 100 x 9
#> # Groups:   property, owner1 [15]
#>    property  year owner1 owner2 owner2_lagged change_detected marriage divorce
#>       <int> <int> <chr>  <chr>  <chr>         <lgl>           <lgl>    <lgl>  
#>  1        1  2000 OKWBQ  QSSVZ  QSSVZ         FALSE           FALSE    FALSE  
#>  2        1  2001 OKWBQ  -empt… QSSVZ         TRUE            FALSE    TRUE   
#>  3        1  2002 OKWBQ  -empt… -empty-       FALSE           FALSE    FALSE  
#>  4        1  2003 OKWBQ  QSSVZ  -empty-       TRUE            TRUE     FALSE  
#>  5        1  2004 OKWBQ  -empt… QSSVZ         TRUE            FALSE    TRUE   
#>  6        1  2005 OKWBQ  -empt… -empty-       FALSE           FALSE    FALSE  
#>  7        1  2006 OKWBQ  -empt… -empty-       FALSE           FALSE    FALSE  
#>  8        1  2007 OYQEJ  QSSVZ  QSSVZ         FALSE           FALSE    FALSE  
#>  9        1  2008 OYQEJ  QSSVZ  QSSVZ         FALSE           FALSE    FALSE  
#> 10        1  2009 OYQEJ  QSSVZ  QSSVZ         FALSE           FALSE    FALSE  
#> # … with 90 more rows, and 1 more variable: partner_swap <lgl>

В качестве альтернативы вы можете использовать dplyr :: case_when () для создания одной переменной, отмечающей тип изменения.

owner_df %>%
  group_by(property, owner1) %>%
  mutate(
    owner2_lagged = lag(owner2, default = first(owner2)),
    change_detected = owner2 != owner2_lagged,
    type_of_change = case_when(
      change_detected & owner2_lagged == "-empty-" ~ "marriage",
      change_detected & owner2 == "-empty-" ~ "divorce",
      change_detected &
        owner2_lagged != "-empty-" & owner2 != "-empty-" ~ "partner_swap"
    )
  )
#> # A tibble: 100 x 7
#> # Groups:   property, owner1 [15]
#>    property  year owner1 owner2  owner2_lagged change_detected type_of_change
#>       <int> <int> <chr>  <chr>   <chr>         <lgl>           <chr>         
#>  1        1  2000 OKWBQ  QSSVZ   QSSVZ         FALSE           <NA>          
#>  2        1  2001 OKWBQ  -empty- QSSVZ         TRUE            divorce       
#>  3        1  2002 OKWBQ  -empty- -empty-       FALSE           <NA>          
#>  4        1  2003 OKWBQ  QSSVZ   -empty-       TRUE            marriage      
#>  5        1  2004 OKWBQ  -empty- QSSVZ         TRUE            divorce       
#>  6        1  2005 OKWBQ  -empty- -empty-       FALSE           <NA>          
#>  7        1  2006 OKWBQ  -empty- -empty-       FALSE           <NA>          
#>  8        1  2007 OYQEJ  QSSVZ   QSSVZ         FALSE           <NA>          
#>  9        1  2008 OYQEJ  QSSVZ   QSSVZ         FALSE           <NA>          
#> 10        1  2009 OYQEJ  QSSVZ   QSSVZ         FALSE           <NA>          
#> # … with 90 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...