Мы можем использовать separate_rows
из tidyr
, чтобы разделить данные на разные строки на основе ";"
, match
Successors
и Jobs
, чтобы получить соответствующие ID
, group_by
ID
и Jobs
и вставьте данные.
library(dplyr)
df %>%
tidyr::separate_rows(Successors, sep = ";") %>%
mutate(SuccessorIds = ID[match(Successors, Jobs)]) %>%
group_by(ID, Jobs) %>%
summarise_at(vars(Successors, SuccessorIds), paste0, collapse = ";")
# ID Jobs Successors SuccessorIds
# <int> <fct> <chr> <chr>
#1 1 JobA JobB;JobC 2;3
#2 2 JobB JobD 4
#3 3 JobC JobD 4
#4 4 JobD NA NA
данные
df <- structure(list(ID = 1:4, Jobs = structure(1:4, .Label = c("JobA",
"JobB", "JobC", "JobD"), class = "factor"), Successors = structure(c(1L,
2L, 2L, NA), .Label = c("JobB;JobC", "JobD"), class = "factor")),
class = "data.frame", row.names = c(NA, -4L))