2016-12-01 95 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") 

另一種方法將是使用interplazyeval包。

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 < - 函數(df,t,f)mutate _(。dots = list(.w。= f))%>% top_n(t,wt = .w。)%> % select( - .w。) }'似乎也適用。太糟糕了,沒有明顯的方法來使用該方法而無需創建額外的評估列 – Drey

相關問題