2016-12-01 4 views
1

dplyr::top_n関数の列名をプログラムで設定したいと考えています。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") 

そして、私にはそれがError: object 'f' not foundと伝えます。私はlazyevalパッケージで試してみましたが、どういうわけか私はそのコンセプトを誤解しています。誰かが私を正しい方向に押し込んでくれますか?ありがとう!

答えて

1

top_nは非標準評価を使用しています。それはデータフレームdfの文脈で式eval(as.name(f), envir = df))を評価しようとしており、その環境にはfが存在しません。

一時的に希望する値のwtをデータフレームに追加することがあります。

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") 

別のアプローチは、lazyevalパッケージからinterpを使用することです。

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

ありがとうございます。この 'getSubset < - function(df、t、f){ df%>% mutate _(ドット=リスト(.w。= f))%>% top_n(t、wt = .w。)%> % select( - .w。) } 'もうまくいくようです。追加の評価列を作成せずにメソッドを使用する明白な方法がないことはあまりにも悪い – Drey

関連する問題