2017-08-25 95 views
19

我注意到,當向dplyr::summarize_at提供列索引時,將確定要彙總的列不包括分組列。我想知道這是否應該如此,因爲通過這種設計,使用正確的列索引取決於總結列是位於分組列之前還是之後。在列索引中使用dplyr summarise_at

下面是一個例子:

library(dplyr) 
data("mtcars") 

# grouping column after summarise columns 
mtcars %>% group_by(gear) %>% summarise_at(3:4, mean) 
## A tibble: 3 x 3 
# gear  disp  hp 
# <dbl> <dbl> <dbl> 
#1  3 326.3000 176.1333 
#2  4 123.0167 89.5000 
#3  5 202.4800 195.6000 

# grouping columns before summarise columns 
mtcars %>% group_by(cyl) %>% summarise_at(3:4, mean) 
## A tibble: 3 x 3 
# cyl  hp  drat 
# <dbl>  <dbl> <dbl> 
#1  4 82.63636 4.070909 
#2  6 122.28571 3.585714 
#3  8 209.21429 3.229286 

# no grouping columns 
mtcars %>% summarise_at(3:4, mean) 
#  disp  hp 
#1 230.7219 146.6875 

# actual third & fourth columns 
names(mtcars)[3:4] 
#[1] "disp" "hp" 

packageVersion("dplyr") 
#[1] ‘0.7.2’ 

公告彙總列如何變化取決於分組和分組列的位置。

這在其他平臺上是一樣的嗎?它是一個錯誤還是一個功能?

+1

似乎意,因爲'summarise_at'調用'tbl_nongroup_vars',它得到了tibble不進行分組變量。然後在該組上應用「意思」。 – lukeA

+3

@lukeA,謝謝你檢查出來!我不得不說,如果我必須確定索引並減去分組列的數量,那麼我覺得這非常不直觀。 –

+3

而不是使用'3:4',這樣做會比'vars(disp:hp)'更安全。例如:'mtcars%>%group_by(cyl)%>%summarise_at(vars(disp:hp),mean)' – MrFlick

回答

1

@docendodiscimus感謝您指出這一點,因爲即使此功能是故意的,文檔也沒有明確說明這一點,在我的情況下,可能是錯誤的來源。實際上,在回答other question之前,這個問題已經解決了,上面的評論用相同的邏輯正確地做了。


此時,可能的解決方案是提供名稱而不是索引。但一個仍然能夠使用索引它使剛剛加入幾個符號.vars = names(.)[3:4],如下圖所示:

mtcars %>% 
    group_by(cyl) %>% 
    summarise_at(.vars = colnames(.)[3:4] , mean) 

mtcars %>% 
    group_by(cyl) %>% 
    summarise_at(.vars = names(.)[3:4] , mean) 


## A tibble: 3 x 3 
# cyl  disp  hp 
# <dbl> <dbl>  <dbl> 
#1  4 105.1364 82.63636 
#2  6 183.3143 122.28571 
#3  8 353.1000 209.21429