2014-02-07 4 views
10

У меня есть функция в моей реальной проблеме, которая возвращает список. Есть ли способ использовать это с 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

Это не поддерживается в настоящее время, но будет в следующей версии dplyr. (По крайней мере, для data.frames, учитывая комментарии Arun, неясно, что data.table позволяет использовать списки как столбцы) – hadley

+0

@hadley, первая строка на 'data.table' [домашняя страница] (http: //datatable.r -forge.r-project.org/): «Быстрое подмножество, быстрая группировка, быстрое назначение, быстрые упорядоченные объединения и« столбцы списка »в коротком и гибком синтаксисе». Он поддерживает. Учитывая, что он упоминает, что выход «цикличен», я предполагаю, что ответ Броди - это то, что он ожидает. RonRich, пожалуйста, покажите нам, как должен выглядеть результат. – Arun

+0

Выход brodie правильный. я опубликую новый вопрос с ориентацией data.table, которая более четко иллюстрирует мою реальную проблему. – RonRich

ответ

8

Идиоматический способ сделать это с использованием 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 были назвать это выход, то п ames будет отображаться в столбцах конечного результата:

# 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  
+0

@ Арун, вздох! когда была реализована модификация модификации с несколькими переменными? Я так долго томился. – BrodieG

+0

@BrodieG Looong время назад :) Может быть, 1.8.6 или раньше? –

+0

Я не уверен, что это то, чего хотел OP. Что, если 'myfun' возвращал линейную модель? – hadley

0

Функция mutate() предназначена для добавления новых столбцов в существующий фрейм данных. Кадр данных представляет собой список векторов одинаковой длины. Таким образом, вы не можете добавить список в качестве нового столбца, потому что список не является вектором.

Вы можете переписать свою функцию как две функции, каждая из которых возвращает вектор. Затем примените каждый из них отдельно с помощью mutate(), и он должен работать.

+8

Но список - это вектор ... – hadley

+0

hmmm .... Мне явно нужно сделать домашнюю работу. –