看來summarise
和summarise_each
正在對它們提供的回調函數進行不必要的額外調用。假設我們有以下dplyr summarize()和summarise_each()對所提供的函數進行額外調用
X <- data.frame(Group = rep(c("G1","G2"),2:3), Var1 = 1:5, Var2 = 11:15)
,看起來像這樣:
Group Var1 Var2
1 G1 1 11
2 G1 2 12
3 G2 3 13
4 G2 4 14
5 G2 5 15
進一步假設我們有一個(潛在的昂貴)功能
f <- function(v)
{
cat("Calling f with vector", v, "\n")
## ...additional bookkeeping and processing...
mean(v)
}
,我們想申請每個組中的每個變量。使用dplyr
,我們不妨去了解它以下列方式:
X %>% group_by(Group) %>% summarise_each(funs(f))
但是,輸出顯示f
被稱爲一個額外的時間爲每個變量在G1:
Calling f with vector 1 2
Calling f with vector 1 2
Calling f with vector 3 4 5
Calling f with vector 11 12
Calling f with vector 11 12
Calling f with vector 13 14 15
# A tibble: 2 x 3
Group Var1 Var2
<fctr> <dbl> <dbl>
1 G1 1.5 11.5
2 G2 4.0 14.0
同樣的問題存在使用summarize
時:
> X %>% group_by(Group) %>% summarise(test = f(Var1))
Calling f with vector 1 2
Calling f with vector 1 2
Calling f with vector 3 4 5
# A tibble: 2 × 2
Group test
<fctr> <dbl>
1 G1 1.5
2 G2 4.0
這究竟是爲什麼,以及如何將一個去阻止summarise
和summarise_each
從打這些額外的電話?
(這是使用R
版本3.3.0和0.5.0版本dplyr
)
編輯:看來,問題與group_by
和summarise
/summarise_each
之間的相互作用有關。沒有分組,不會有額外的呼叫。此外,mutate
和mutate_each
不會遇到此問題。 (對於這些發現,信用度:eddi和eipi10)
你可以進一步縮小範圍 - 問題出在'summarise'(和'group_by') – eddi
我實際上傾向於使用'group_by'的問題。做一個簡單的'X%>%彙總(test = f(Var1))'表現得像預期的那樣,但是'X%>%group_by(Group)%>%summarize(test = f(Var1))'不。 –
'mutate'和'mutate_each'不會受到這個錯誤的影響(與'group_by'一起使用時) – eddi