2017-07-19 6 views
2

グループ化された集計変数を対応する識別変数のリストと共に出力しようとしています。dplyrでカスタムインデックスを要約して一覧表示します

例として、データセットを使用して、別の出力列の各一致に対応する名前のベクトルをジェンダー別にグループ化した「明るい」肌色の文字数を計算したいと思います。実世界のユースケースで

、そこsummariseに複数の条件となり、ユニークな識別子がsubjectID/studyIDは/ etcである可能性があります。私はdata.tableソリューションにオープンしています、ベクトルベースのソリューションを好む、Shinyフレンドリーで、簡単に関数に変換されます。 dplyr::starwarsから

例:

starwars %>% 
    filter(species %in% c("Human", "Droid")) %>% 
    group_by(gender) %>% 
    summarise(
    skin = sum(skin_color=="light", na.rm=T), 
    hair = sum(hair_color=="brown", na.rm=T) 
) 

所望の出力:

gender skin hair skinname             hairname 
female 6 6 femname1, femname2, femname3, femname4, femname5, femname6 femhname1, femhname2, femhname3, femhname4, femhname5, femhname6 
male 5 8 mname1, mname2, mname3, mname4, mname5      mhname1, mhname2, mhname3, mhname4, mhname5, mhname6, mhname7 mhname8 
none 0 0             
<NA> 0 0 

この出力は、その後t()を使用して転置されると(DTに一致する名前のホバーオーバー表示を作成するために、paste()を使用しますDataTables)。

私はsummarise/mutatedo.callsummariseステップで

skinname = as.list(.$name[which(skin_color == "light")]) 

のようなもの、あるいはおそらくカスタム関数を必要と考えています。

答えて

2

あなたは、ネストされたdata.frameをしたい場合は、あなたがtidyr::nest使用することができます。

library(tidyverse) 

starwars %>% 
    filter(species %in% c("Human", "Droid"), 
      skin_color == 'light') %>% 
    group_by(gender) %>% 
    group_by(skin = n(), add = TRUE) %>% 
    nest(name) 
#> # A tibble: 2 x 3 
#> gender skin    data 
#> <chr> <int>   <list> 
#> 1 female  6 <tibble [6 x 1]> 
#> 2 male  5 <tibble [5 x 1]> 

またはあなただけのネストされたベクトルをしたい場合は、listで要約:

starwars %>% 
    filter(species %in% c("Human", "Droid"), 
      skin_color == 'light') %>% 
    group_by(gender) %>% 
    summarise(skin = n(), 
       name = list(name)) 
#> # A tibble: 2 x 3 
#> gender skin  name 
#> <chr> <int> <list> 
#> 1 female  6 <chr [6]> 
#> 2 male  5 <chr [5]> 

たりしたい場合にフィルタの代わりに空の行を保持するサブセット:

starwars %>% 
    filter(species %in% c("Human", "Droid")) %>% 
    group_by(gender) %>% 
    summarise(
     skin = sum(skin_color == "light"), 
     name = list(name[skin_color == 'light']) 
    ) 
#> # A tibble: 4 x 3 
#> gender skin  name 
#> <chr> <int> <list> 
#> 1 female  6 <chr [6]> 
#> 2 male  5 <chr [5]> 
#> 3 none  0 <chr [0]> 
#> 4 <NA>  0 <chr [0]> 

名前を1つの文字列に縮小したい場合は、toStringがその仕事を行いますが、後で分離する予定がある場合は、文字列にカンマがないことを確認してください。

+0

ありがとうございました。私は、目的が複数の条件のカウントのグループ化されたサマリーテーブルを作成することであることを言及しておきます。その結果、 'skin_color == light'を' filter() 'ステップに動かすことはできません。私は明確にするために質問を編集します。 –

+0

次に、フィルタリングの代わりにグループ化する必要があるように聞こえます。 – alistaire

+0

あなたの最後の選択肢は、私が探している解決策、ありがとうと思います。 –

関連する問題