我已經看到了一些關於如何使用dplyr
函數編寫自己的函數的文章。例如,您可以看到如何在this post中使用group_by (regroup)
和summarise
。我認爲看看我是否可以使用主要dplyr
函數編寫函數會很有趣。我的希望是我們可以進一步瞭解如何使用dplyr
函數編寫函數。功能中的主要dplyr函數
DATA
country <- rep(c("UK", "France"), each = 5)
id <- rep(letters[1:5], times = 2)
value <- runif(10, 50, 100)
foo <- data.frame(country, id, value, stringsAsFactors = FALSE)
目標
我想寫以下過程中的功能。
foo %>%
mutate(new = ifelse(value > 60, 1, 0)) %>%
filter(id %in% c("a", "b", "d")) %>%
group_by(country) %>%
summarize(whatever = sum(value))
TRY
### Here is a function which does the same process
myFun <- function(x, ana, bob, cathy) x %>%
mutate(new = ifelse(ana > 60, 1, 0)) %>%
filter(bob %in% c("a", "b", "d")) %>%
regroup(as.list(cathy)) %>%
summarize(whatever = sum(ana))
myFun(foo, value, id, "country")
Source: local data frame [2 x 2]
country whatever
1 France 233.1384
2 UK 245.5400
你也許會意識到arrange()
是不存在的。這是我掙扎的人。這裏有兩點意見。第一個實驗是成功的。這些國家的順序從英法到英法。但第二個實驗沒有成功。
### Experiment 1: This works for arrange()
myFun <- function(x, ana) x %>%
arrange(ana)
myFun(foo, country)
country id value
1 France a 90.12723
2 France b 86.64229
3 France c 74.93320
4 France d 80.69495
5 France e 72.60077
6 UK a 84.28033
7 UK b 67.01209
8 UK c 94.24756
9 UK d 79.49848
10 UK e 63.51265
### Experiment2: This was not successful.
myFun <- function(x, ana, bob) x %>%
filter(ana %in% c("a", "b", "d")) %>%
arrange(bob)
myFun(foo, id, country)
Error: incorrect size (10), expecting :6
### This works, by the way.
foo %>%
filter(id %in% c("a", "b", "d")) %>%
arrange(country)
鑑於第一個實驗是成功的,我很難理解第二個實驗失敗的原因。在第二次實驗中可能有一件事需要做。有沒有人有想法?感謝您抽出時間。
Deparsing和粘貼字符串是_永遠_寫答案。 – hadley 2014-09-23 22:49:48
@hadley ok,在這種情況下,您會推薦「創建列表」方法? – 2014-09-23 22:53:15
我推薦使用'substitute()',或者等待https://github.com/hadley/dplyr/issues/352 – hadley 2014-09-23 22:54:15