У меня есть два набора данных, которые я хочу объединить.Один из столбцов, который я хочу использовать в качестве ключа для слияния, имеет значения в списке.Если какое-либо из этих значений появится в столбце второго набора данных, я хочу, чтобы значение в другом столбце было объединено с первым набором данных - это может означать, что существует несколько значений, которые должны быть представлены в виде списка.
Это довольно сложно объяснить, но, надеюсь, данные этого примера проясняют ситуацию.
Пример данных
library(data.table)
mother_dt <- data.table(mother = c("Penny", "Penny", "Anya", "Sam", "Sam", "Sam"),
child = c("Violet", "Prudence", "Erika", "Jake", "Wolf", "Red"))
mother_dt [, children := .(list(unique(child))), by = mother]
mother_dt [, child := NULL]
mother_dt <- unique(mother_dt , by = "mother")
child_dt <- data.table(child = c("Violet", "Prudence", "Erika", "Jake", "Wolf", "Red"),
age = c(10, 8, 9, 6, 5, 2))
Так, например, первая строка в моем новом наборе данных будет иметь «Пенни» в столбце mother
, список, содержащий «Фиолетовый »и« Благоразумие »в столбце children
, а также список, содержащий 10 и 8 в столбце age
.
Я пробовал следующее:
combined_dt <- mother_dt[, child_age := ifelse(child_dt$child %in% children,
.(list(unique(child_dt$age))), NA)
Но это просто содержит список всех возрастов в последней строке.
Я ценю, что это, вероятно, довольно необычное поведение, но есть ли способ достичь этого?
Редактировать: Окончательная таблица данных будет выглядеть так:
final_dt <- data.table(mother = c("Penny", "Anya", "Sam"),
children = c(list(c("Violet", "Prudence")), list(c("Erika")), list(c("Jake", "Wolf", "Red"))),
age = c(list(c(10, 8)), list(c(9)), list(c(6, 5, 2))))