2015-12-14 3 views
2

J'essaie de développer une solution réutilisable pour le problème suivant.R Application de différentes fonctions à différentes colonnes de trame de données

Je vais avoir différentes trames de données et je souhaite définir certaines fonctions de base, puis appliquer ces fonctions aux différentes colonnes de la trame de données. Le résultat serait une trame de données ayant le même nombre de lignes et de colonnes que la trame de données d'origine.

Je souhaite que cette solution soit réutilisable dans la mesure où différentes combinaisons de fonctions peuvent être appliquées à différentes trames de données.

C'est un peu difficile d'expliquer cela en mots. J'espère que le code ci-dessous rendra ce qui précède un peu plus clair.

# construct an example data frame 
v_a <- c(1, 4, 8, 10, 12) 
v_b <- c(4, 6, 7, 4, 3) 
v_c <- c(10, 23, 45, 12, 45) 
v_d <- c(12, 45, 7, 10, 5) 

df <- data.frame(a = v_a, b = v_b, c = v_c, d = v_d) 

# define some example functions 
fn_1 <- function(x) x * 3 
fn_2 <- function(x) x * 4 


# assemble functions into a vector 
vct_functions <- c(fn_1, fn_2, fn_1, fn_1) 

# apply vector of functions to columns in a data.frame 
new_df <- fn_apply_functionList(df, vct_functions) 

J'espère réutiliser la solution ci-dessus telle qu'une combinaison différente des fonctions pourrait être appliquée à la même ou une trame de données différentes.

Encore une fois, ce qui suit est un extrait de code pour rendre cela plus clair.

# create another vector of functions 
vct_functionsB <- c(fn_3, fn_4, fn_1, fn_2) 

# apply vector of functions to columns in a data.frame 
new_df <- fn_apply_functionList(another_df, vct_functions) 

Toutes les idées sur une solution élégante seraient vraiment appréciées.

+0

Si vous avez 2+ Les objets de même longueur à boucler, utilisent 'Map' ou' mapply' - 'df [] <- Map (fonction (d, f) f (d), df, fonctions vct)' par exemple. – thelatemail

+0

Merci. Je pense que la solution Map() passe deux ensembles d'arguments à une fonction. Je veux appliquer un vecteur de n fonctions à n listes. – markthekoala

Répondre

3

@geotheory était presque là, vct_functionsB est contraint à un list

Essayez ceci,

do.call(cbind, lapply(1:ncol(df), function(c) vct_functions[[c]](df[, c]))) 
+0

damn you jMathew :) – geotheory

0

Peut-être que ce ..?

lapply(1:ncol(df), FUN=function(i){vct_functionsB[i](df[,i])}) 

Et puis unlist/parser les résultats ..

+0

Merci pour la solution. Je pensais que cela fonctionnerait mais quand je l'ai essayé .... J'ai reçu le message suivant: "erreur dans FUN (X [[i]], ...): tentative d'appliquer non-fonction" mmmm ?? – markthekoala

+0

Désolé je ne sais pas pourquoi cela ne fonctionne pas. Bizarre – geotheory

+1

Assez sûr que c'est parce que 'vct_functionsB [i]' devrait être 'vct_functionsB [[i]]'. Vérifiez 'list (fonction (x) x) [1] (5)' contre 'list (fonction (x) x) [[1]] (5)' –