acho que vc tem duas opções: ou fazer um “verificador de vinculo” e aplicar em todas as linhas ou fazer por join
library(tidyverse)
da <- tibble::tribble(
~id, ~nome, ~mae, ~pai,
1, "Maria", "Neuza", "Ernesto",
2, "João", "Ana Maria", "Ari",
3, "Carlos", "Conceição", "Erasmo",
4, "Eduardo", "Filomena", "Antônio",
5, "Andre", "Judite", "Manuel",
6, "Julia", "Ana Maria", "Ari",
7, "Alice", "Filomena", "Antônio",
8, "Adriana", "Anastácia", "Renato",
9, "Leandro", "Rute", "Marcos",
10, "Raquel", "Judite", "Manuel"
)
# solucao 1
da %>%
left_join(select(da, mae, pai, id), c("mae", "pai")) %>%
group_by(id.x) %>%
filter(n() == 1 | id.x != id.y) %>%
ungroup() %>%
mutate(vinculo = if_else(id.y == id.x, NA_real_, id.y)) %>%
select(id = id.x, mae, pai, vinculo)
#> # A tibble: 10 x 4
#> id mae pai vinculo
#> <dbl> <chr> <chr> <dbl>
#> 1 1 Neuza Ernesto NA
#> 2 2 Ana Maria Ari 6
#> 3 3 Conceição Erasmo NA
#> 4 4 Filomena Antônio 7
#> 5 5 Judite Manuel 10
#> 6 6 Ana Maria Ari 2
#> 7 7 Filomena Antônio 4
#> 8 8 Anastácia Renato NA
#> 9 9 Rute Marcos NA
#> 10 10 Judite Manuel 5
# solucao 2
verificar_vinculo <- function(id_pesq, mae_pesq, pai_pesq, da) {
id_vinculo <- da %>%
filter(id != id_pesq, mae == mae_pesq, pai == pai_pesq) %>%
pull(id)
if (length(id_vinculo) == 0) NA_real_ else id_vinculo
}
da %>%
rowwise() %>%
mutate(vinculo = verificar_vinculo(id, mae, pai, da)) %>%
ungroup()
#> # A tibble: 10 x 5
#> id nome mae pai vinculo
#> <dbl> <chr> <chr> <chr> <dbl>
#> 1 1 Maria Neuza Ernesto NA
#> 2 2 João Ana Maria Ari 6
#> 3 3 Carlos Conceição Erasmo NA
#> 4 4 Eduardo Filomena Antônio 7
#> 5 5 Andre Judite Manuel 10
#> 6 6 Julia Ana Maria Ari 2
#> 7 7 Alice Filomena Antônio 4
#> 8 8 Adriana Anastácia Renato NA
#> 9 9 Leandro Rute Marcos NA
#> 10 10 Raquel Judite Manuel 5
Created on 2020-09-22 by the reprex package (v0.3.0)