2017-02-16 55 views
2

我試圖使用標準評估從tidyr包中排除gather()的列。使用標準評估排除來自tidyr包的聚集()的列使用標準評估

使用非標準的評價,這工作得很好:但

mtcars_df <- head(mtcars[, c("mpg", "hp", "cyl")]) 
tidyr::gather(mtcars_df, key, val, -cyl) 

,使用標準的評價,無論是以下工作,都返回一個錯誤:

tidyr::gather_(mtcars_df, "key", "val", -"cyl") 
tidyr::gather_(mtcars_df, "key", "val", -cyl) 

作爲一個變通辦法,我試圖使用select()幫手功能,但這只是返回了原來的data.frame,mtcars_df

tidyr::gather_(mtcars_df, "key", "val", -dplyr::contains("cyl")) 

如何使用標準評估以這種方式排除列?這裏發生了什麼?

no visible binding for global variable '.' 

+1

這是更多的工作,但'mtcars_df%>%聚_(「鍵」,「值」,名稱(。)名稱(。)!='cyl'])'。雖然可能有一個更簡單的習慣用法。 – alistaire

回答

3

根據tidyr github上的問題#109: gather_ no longer supports dropping a column?

gather_() only works with character vectors. - Hadley Wickham, 2015

您可以嘗試

library(dplyr) 
mtcars_df %>% tidyr::gather_("key", "val", setdiff(names(.), "cyl")) 
+1

對於提交給CRAN,正如@Dom指出的那樣:'mtcars_df%>%tidyr :: gather _(「key」,「val」,names(mtcars_df)[names(mtcars_df)!=「cyl」] )' –

1

Altough你的變通辦法,在一個封裝中使用時,它會創建一個NOTE這可以防止它在CRAN上發佈:(

是否有任何其他方式使用standart評估排除使用gather_的列?

我試過很多東西(如使用dplyr::select_vars),但是毫無效果......

+1

我想我有同樣的問題,但沒有在這裏承認:我的解決方案(我忘了我是如何來到這個,所以如果是從別人 - 謝謝:) :)是:'mtcars_df%>%tidyr ::收集_(「鑰匙」,「瓦爾」,名稱(mtcars_df)[名稱(mtcars_df)!=「cyl」])'這應該工作時發佈到CRAN –

+0

謝謝@JoshuaRosenberg它工作! –