2017-02-14 36 views
0

Я хочу заменить части функции преобразования переменными входами.Подставляя часть функции с переменным входом

Я создал ФР, используя подмножество с col1 из существующей таблицы:

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

ФР выглядит примерно так:

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

теперь я хочу, чтобы автоматизировать расчеты, которые вручную будет выглядеть как это:

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

где (A + B + C) относится к столбцам df. Поскольку у меня есть сотни «col1», я не могу это сделать вручную. Я пытался использовать что-то похожее на% s (как доступно в python 2.X), но до сих пор ничего не работало, и я слишком мало понимаю R (связанный с eval()?), Чтобы заставить все работать (попробовал пасту, как .formula, sprintf, заменитель и т. д.).

Использование cv (col1) Я пытаюсь вставить результат внутри функции преобразования, но самый дальний из них был преобразован, пытаясь захватить значения из среды (а не столбцов) при использовании as.formula.

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

Поблагодарили бы за любые подсказки или идеи!

ответ

2

Вы совершили маневрирование в странный угол. Это легко с 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 
+0

О, мальчик .. Большое вам спасибо! – Daan11

+0

Решение 'Reduce' так приятно. –

0

Вы можете получить подобный эффект с помощью mutate из dplyr:

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

Здесь мы говорим mutate_ (запятнать _), что делать с помощью paste(), который дает "A+B+C" и используйте setNames, чтобы назвать новый столбец.

Я признаю, что синтаксис несколько запутан, но это связано с non-standard evaluation в dplyr. Но если вы хотите сделать это в экосистеме dplyr, это способ сделать это.

 Смежные вопросы

  • Нет связанных вопросов^_^