2017-08-25 4 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

は、意図しているようです。 'mean'がそのセットに適用されます。 – 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]を、追加することによって、それだけでインデックスを使用して行うことが可能です: `summarise_at`は変数をグループ化することなく、tibbleを取得` tbl_nongroup_vars`を呼び出すよう

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 
関連する問題