Xlrv
Xlrv

Reputation: 509

How to pass a single row for a function using dplyr

I am trying to apply a custom function to a data.frame row by row, but I can't figure out how to apply the function row by row. I'm trying rowwise() as in the simple artificial example below:

library(tidyverse)

my_fun <- function(df, col_1, col_2){
  df[,col_1] + df[,col_2]
}

dff <- data.frame("a" = 1:10, "b" = 1:10)

dff %>%
  rowwise() %>%
  mutate(res = my_fun(., "a", "b"))

How ever the data does not get passed by row. How can I achieve that?

Upvotes: 2

Views: 455

Answers (1)

IceCreamToucan
IceCreamToucan

Reputation: 28685

dplyr's rowwise() puts the row-output (.data) as a list of lists, so you need to use [[. You also need to use .data rather than ., because . is the entire dff, rather than the individual rows.

my_fun <- function(df, col_1, col_2){
  df[[col_1]] + df[[col_2]]
}

dff %>%
  rowwise() %>%
  mutate(res = my_fun(.data, 'a', 'b'))

You can see what .data looks like with the code below

dff %>%
  rowwise() %>%
  do(res = .data) %>% 
  .[[1]] %>% 
  head(1)

# [[1]]
# [[1]]$a
# [1] 1
# 
# [[1]]$b
# [1] 1

Upvotes: 2

Related Questions