Вернуть список в 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(), и он должен работать.