Вернуть список в dplyr mutate()
У меня есть функция в моей реальной проблеме, которая возвращает список. Есть ли способ использовать это с dplyr mutate()? Этот пример игрушки не работает -:
it = data.table(c("a","a","b","b","c"),c(1,2,3,4,5), c(2,3,4,2,2))
myfun = function(arg1,arg2) {
temp1 = arg1 + arg2
temp2 = arg1 - arg2
list(temp1,temp2)
}
myfun(1,2)
it%.%mutate(new = myfun(V2,V3))
Я вижу, что он циклически перебирает результат функции в первом "столбце" новой переменной, но не понимаю почему.
Спасибо!
Ответы
Ответ 1
Идиоматическим способом сделать это с помощью data.table
будет использование оператора :=
(присвоение по ссылке). Вот иллюстрация:
it[, c(paste0("V", 4:5)) := myfun(V2, V3)]
Если вам действительно нужен список, почему бы и нет:
as.list(it[, myfun(V2, V3)])
В качестве альтернативы, возможно, это то, что вы хотите, но почему бы вам просто не использовать функциональность data.table
:
it[, c(.SD, myfun(V2, V3))]
# V1 V2 V3 V4 V5
# 1: a 1 2 3 -1
# 2: a 2 3 5 -1
# 3: b 3 4 7 -1
# 4: b 4 2 6 2
# 5: c 5 2 7 3
Обратите внимание, что если myfun
должен был называть его вывод, то имена появлялись в столбцах конечного результата:
# V1 V2 V3 new.1 new.2
# 1: a 1 2 3 -1
# 2: a 2 3 5 -1
# 3: b 3 4 7 -1
# 4: b 4 2 6 2
# 5: c 5 2 7 3
Ответ 2
Функция mutate() предназначена для добавления новых столбцов в существующий фрейм данных. Кадр данных представляет собой список векторов одинаковой длины. Таким образом, вы не можете добавить список в качестве нового столбца, потому что список не является вектором.
Вы можете переписать свою функцию как две функции, каждая из которых возвращает вектор. Затем примените каждый из них отдельно, используя mutate(), и он должен работать.