Daan11
Daan11

Reputation: 67

Substituting part of a function with variable input

I want to substitute parts of the transform function with variable inputs.

I have created a df using subset with col1 from an existing table:

col1 = c('A','B','C')

The df looks something like this:

A = c(1, 3) 
B = c(3, 1) 
C = c(5, 2) 
df = data.frame(A, B, C)

I now want to automate calculations which manually would look like this:

df <- transform(df, 'ABC' = (A + B + C))

where (A + B + C) refers to the columns of the df. Because I have hundreds of 'col1's I can't do it by hand. I was trying to use something similar to %s (as available in python 2.X), yet so far nothing really worked and I understand too little of R (related to eval()?)to get things working (tried paste, as.formula, sprintf, substitute etc.).

Using cv(col1) I'm trying to paste the output inside the transform function, yet the furthest I got was transform trying to grab values from the environment (not columns) when using as.formula.

cv = function(var){
  output = paste('(', paste(var, collapse = ' + '), ')', sep = '')
  return(output)
}

Would appreciate any hints or ideas!

Upvotes: 0

Views: 76

Answers (2)

Roland
Roland

Reputation: 132989

You have maneuvered yourself into a strange corner. This is easy with R:

cols <- c("A", "B", "C")
df[, paste(cols, collapse = "")] <- rowSums(df[, cols])
#alternatively for other binary functions:
#Reduce("+", df[, cols])
#  A B C ABC
#1 1 3 5   9
#2 3 1 2   6

Upvotes: 2

Paul Hiemstra
Paul Hiemstra

Reputation: 60984

You can get a similar effect using mutate from dplyr:

library(dplyr)
cols <- c("A", "B", "C")
df %>% mutate_(.dots = setNames(paste(cols, collapse = '+'), 
                                'new_column_name'))

Here we tell mutate_ (spot the _) what to do via paste() which yields "A+B+C", and use setNames to name the new column.

I acknowledge the syntax is somewhat convoluted, but this is related to non-standard evaluation in dplyr. But if you want to do this in the dplyr ecosystem, this is the way to do it.

Upvotes: 0

Related Questions