2016-12-01 2 views
1

Je souhaite définir par programme un nom de colonne pour la fonction dplyr::top_n.Définition d'un nom de colonne par programme dans dplyr :: top_n

getSubset <- function(df, t, f) { 
    df %>% 
    top_n(t, wt = eval(as.name(f), envir = df)) 
} 

data.frame(x = 1:20, y = 20:1) %>% 
    getSubset(10, "x") 

Et il me dit que Error: object 'f' not found. J'ai essayé de jouer avec le paquet lazyeval mais de toute façon je continue à mal comprendre le concept. Quelqu'un pourrait-il me pousser dans la bonne direction? Merci!

Répondre

1

Votre problème est que top_n utilise une évaluation non standard. Il essaie d'évaluer l'expression eval(as.name(f), envir = df)) dans le contexte de la trame de données df, et f n'existe pas dans cet environnement. Une solution consiste à ajouter temporairement la valeur souhaitée de wt à la trame de données.

getSubset <- function(df, t, f) { 
    df %>% 
     mutate(.wt = eval(as.name(f), envir = df)) %>% 
     top_n(t, wt = .wt) %>% 
     select(-.wt) 
} 

data.frame(x = 1:20, y = 20:1) %>% 
    getSubset(10, "x") 

Une autre approche serait d'utiliser interp du package lazyeval.

getSubset <- function(df, t, f) { 
    call <- quote(df %>% 
         top_n(t, wt = .wt)) 
    call <- interp(call, .wt = eval(as.name(f), envir = df)) 
    eval(call) 
} 

data.frame(x = 1:20, y = 20:1) %>% 
    getSubset(10, "x") 
+1

Merci pour les suggestions. Cette fonction 'getSubset <- (df, t, f) { df%>% mute _ (. Points = liste (.w. = F))%>% top_n (t, wt = .w.)%> % select (- .w.) } 'semble fonctionner aussi. Dommage qu'il n'y ait pas de moyen évident d'utiliser la méthode sans créer de colonne d'évaluation supplémentaire – Drey