Без примеров данных это своего рода удар в темноте, но я попробую! Создание некоторых фиктивных данных в соответствии с вашим описанием.
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