Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return a list in dplyr mutate()

I have a function in my real-world problem that returns a list. Is there any way to use this with the dplyr mutate()? This toy example doesn't work -:

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))

I see that it is cycling through the output of the function in the first "column" of the new variable, but do not understand why.

Thanks!

like image 561
RonRich Avatar asked Feb 07 '14 14:02

RonRich


People also ask

What does mutate () do in R?

What is the mutate() function in R? We can use the mutate() function in R programming to add new variables in the specified data frame. These new variables are added by performing the operations on present variables. Before using the mutate() function, you need to install the dplyr library.

How do you use mutate dplyr in R?

To use mutate in R, all you need to do is call the function, specify the dataframe, and specify the name-value pair for the new variable you want to create.

What does %>% do in dplyr?

%>% is called the forward pipe operator in R. It provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. It is defined by the package magrittr (CRAN) and is heavily used by dplyr (CRAN).


1 Answers

The idiomatic way to do this using data.table would be to use the := (assignment by reference) operator. Here's an illustration:

it[, c(paste0("V", 4:5)) := myfun(V2, V3)]

If you really want a list, why not:

as.list(it[, myfun(V2, V3)])

Alternatively, maybe this is what you want, but why don't you just use the data.table functionality:

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    

Note that if myfun were to name it's output, then the names would show up in the final result columns:

#    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    
like image 105
BrodieG Avatar answered Sep 21 '22 20:09

BrodieG