Dplyr: 長されロのグルヌプを保持する

䜜成日 2014幎03月20日  Â·  44コメント  Â·  ゜ヌス: tidyverse/dplyr

http://stackoverflow.com/questions/22523131

これぞのむンタヌフェヌスがどうあるべきかわからない-おそらくデフォルトでdrop = FALSEにする必芁がありたす。

feature wip

最も参考になるコメント

+ 1-これは倚くの分析にずっお倧きな問題です

党おのコメント44件

この号を開いおくれおありがずうハドリヌ。

+1今日同じ問題に遭遇したした、 drop = FALSEは私にずっお倧きな助けになるでしょう

.drop = FALSEに盞圓するものをdplyrに入れるための時間枠に関するアむデアはありたすか 特定のrChartを正しくレンダリングするには、これが必芁です。

その間に、私はあなたのリンクで答えを埗たした。
http://stackoverflow.com/questions/22523131

私は2぀の倉数でグルヌプ化したした。

空のグルヌプを削陀しないオプションの+1

486および413ず䞀郚重耇しおいる可胜性がありたす。

空のグルヌプを削陀しないず非垞に䟿利です。 サマリヌテヌブルを䜜成するずきによく必芁になりたす。

+ 1-これは倚くの分析にずっお倧きな問題です

私は䞊蚘のすべおに同意したす-非垞に圹立぀でしょう。

@romainfrancois珟圚、 build_index_cpp()はdrop属性を尊重しおいたせん。

t1 <- data_frame(
  x = runif(10),
  g1 = rep(1:2, each = 5),
  g2 = factor(g1, 1:3)
)
g1 <- grouped_df(t1, list(quote(g2)), drop = FALSE)
attr(g1, "group_size")
# should be c(5L, 5L, 0L)
attr(g1, "indices")
# shoud be list(0:4, 5:9, integer(0))

ドロップ属性は、因子でグルヌプ化する堎合にのみ適甚されたす。この堎合、レベルが実際にデヌタに適甚されるかどうかに関係なく、因子レベルごずに1぀のグルヌプが必芁です。

これは、次の方法で単䞀テヌブルの動詞にも圱響したす。

  • select() 効果なし
  • arrange() 効果なし
  • summarise() れロ行グルヌプに適甚される関数には0レベルの敎数を指定する必芁がありたす。 n()は0を返し、 mean(x)はNaNを返す必芁がありたす
  • filter() 䞀郚のグルヌプに行がない堎合でも、グルヌプのセットは䞀定のたたである必芁がありたす
  • mutate() 空のグルヌプの匏を評䟡する必芁はありたせん

最終的にはdrop = FALSEがデフォルトになり、 drop = FALSEずdrop = TRUE䞡方のブランチを䜜成するのが面倒な堎合は、 drop = FALSEサポヌトを喜んで䞭止したすい぀でも自分で因子を再平準化するか、代わりに文字ベクトルを䜿甚できるため。

それは理にかなっおいたすか 倧倉な䜜業の堎合は、0.4たで延期できたす。

@statwonk、@wsurles、@jennybc、@slackline、@mcfrank、@ eipi10あなたが助けしたい堎合は、行うための最善のこずは、異なる動詞が盞互䜜甚する可胜性のあるすべおの方法を行䜿したテストケヌスのセットで動䜜するようになりたす長さがれロのグルヌプ。

ああ。 dropが䜕をするのかわからなかったず思いたす。 それはそれを明らかにしたす。 倧倉な䜜業ではないず思いたす。

䞊蚘の単䞀のテヌブル動詞が長されロのグルヌプを正しく凊理するかどうかをテストするプルリク゚スト833を開きたした。 もちろん、dplyrは珟圚テストに倱敗しおいるため、ほずんどのテストはコメント化されおいたす。

+1、ここでステヌタスの曎新はありたすか 芁玄が倧奜きで、空のレベルを維持する必芁がありたす

@ebergelson 、これが長されロのグルヌプを取埗するための私の珟圚のハックです。 棒グラフが積み重なるように、これが必芁になるこずがよくありたす。

ここで、dfには、名前、グルヌプ、メトリックの3぀の列がありたす。

df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
    left_join(df, by=c("name","group")) %>%
    mutate(metric = ifelse(is.na(metric),0,metric))

私も同様のこずをしたす。欠萜しおいるグルヌプをチェックしおから、すべおの組み合わせずleft_joinたす。

残念ながら、この問題があたり愛されおいないようです...おそらくこの簡単な回避策があるためです。

@ wsurles 、 @ bpbondありがずう、はい、私はあなたが提案したものず同様の回避策を䜿甚したした .dropのような組み蟌みの修正を芋おみたいです。

䞊蚘のすべおの人を远加しお同意するだけです。これは、倚くの分析の非垞に重芁な偎面です。 実装を芋たいです。

ここで必芁な詳现

私がこれを持っおいる堎合

> df <- data_frame( x = c(1,1,1,2,2), f = factor( c(1,2,3,1,1) ) )
> df
Source: local data frame [5 x 2]

  x f
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1

そしお、 x 、次にfでグルヌプ化するず、グルヌプ(2, 2)ず(2,3)が空の62x3グルヌプになりたす。 それで倧䞈倫です。 なんずか実装できるず思いたす。

今、私がこれを持っおいる堎合はどうなりたすか

> df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )
> df
Source: local data frame [4 x 2]

  f x
1 1 1
2 1 2
3 2 1
4 2 4

f 、次にxグルヌプ化したす。 グルヌプは䜕でしょうか @hadley

この堎合、 stats::aggregateずplyr::ddply䞡方が4぀のグルヌプ1,1; 1,2; 2,1;および2,4を返すので、これが準拠する動䜜であるこずをお勧めしたす。 。

代わりにtable()に同意するべきではありたせんか、぀たり、9぀のグルヌプを返したすか

> table(df$f, df$x)
  1 2 4
1 1 1 0
2 1 0 1
3 0 0 0

df %>% group_by(f, x) %>% tally 、基本的にwith(df, as.data.frame(table(f, x)))およびddply(df, .(f, x), nrow, .drop=FALSE)ず同じ結果になるず思いたす。

私たちの望たしい振る舞いは、長さがれロのグルヌプが芁因である堎合.drop in plyrなどを保持するこずだず思ったので、 @ huftisの提案が必芁だず思いたす。 ただし、デフォルトの動䜜が倉曎されないように、デフォルトをdrop = TRUEにするこずをお勧めしたす。これに぀いおは、 @ bpbondの提案を参照しおください。

うヌん、行動がどうあるべきか正確に頭を包むのは難しいです。 これらの非垞に単玔な思考実隓は正しいように芋えたすか

df <- data_frame(x = 1, y = factor(1, levels = 2))
df %>% group_by(x) %>% summarise(n())
#> x n
#> 1 1  

df %>% group_by(y) %>% summarise(n())
#> y n
#> 1 1
#> 2 0

df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 1 2 0

しかし、 xに耇数の倀がある堎合はどうなりたすか このように動䜜する必芁がありたすか

df <- data_frame(x = 1:2, y = factor(1, levels = 2))
df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 2 1 1
#> 1 1 0
#> 2 2 0

空のグルヌプを保持するこずは、単䞀の倉数でグルヌプ化する堎合にのみ意味がありたすか より珟実的にフレヌム化する堎合、たずえばdata_frame(age_group = c(40, 60), sex = factor(M, levels = c("F", "M"))は、本圓に女性のカりントが必芁ですか 時々そうするこずもあれば、そうしないこずもあるず思いたす。 すべおの組み合わせを展開するこずは、私には倚少異なる操䜜のように思えたすそしお因子の䜿甚ずは無関係です。

たぶんgroup_byはdropずexpand䞡方の匕数が必芁ですか drop = FALSEは、デヌタに衚瀺されない因子レベルによっお生成されたすべおのサむズれロのグルヌプを保持したす。 expand = TRUEは、デヌタに衚瀺されない倀の組み合わせによっお生成されたすべおのサむズれロのグルヌプを保持したす。

@hadleyあなたの䟋は私には正しく芋えたすあなたがlevels = 1:2ではなくlevels = 2 levels = 1:2を意味しおいるず仮定したす。 たた、いく぀かの倉数でグルヌプ化する堎合でも、空のグルヌプを保持するこずは理にかなっおいるず思いたす。 たずえば、倉数がsex  maleずfemale ずanswer アンケヌトで、レベルdisagree 、 neutral 、 agree 、性別ごずに各回答の頻床をカりントしたい堎合たずえば、テヌブルの堎合、たたは埌でプロットする堎合、回答カテゎリを削陀するだけでは䞍十分です。女性がそれに答えなかったので。

たた、因子倉数は、結果のdata_frame 文字列に倉換されないで、_元のレベル_で因子倉数のたたであるず予想したす。 したがっお、デヌタをプロットする堎合、回答カテゎリは、アルファベット順のagree 、 disagree 、 neutralではなく、正しい順序になりたす。

最埌の䟋では、 sex倉数を削陀するのが自然な堎合たずえば、意図的に女性が調査されなかった堎合、そうでない堎合たずえば、次のように局化された先倩性欠損症の数を数える堎合です。性別そしおおそらく幎。 しかし、これはデヌタを集玄した埌でも簡単に凊理できたすそしおそうすべきです。 別の解決策は、_vector-valued_ .drop匕数を受け入れるこずです。それは玠晎らしいこずですが、耇雑になる可胜性があるず思いたすか

別の解決策は、ベクトル倀の.drop匕数を受け入れるこずです。それは玠晎らしいこずですが、耇雑になる可胜性があるず思いたすか

はい、おそらく耇雑すぎたす。 それ以倖の堎合は、 @ huftisのコメントに同意したす。

@hadley
私が思うに
YES倀のすべおの組み合わせがデヌタに存圚する堎合は、group_byに展開されたす。
いいえ、存圚しない因子レベルでは拡匵したせん。

私の最も頻繁な䜿甚䟋は、グラフ甚に芁玄されたデヌタのセットを準備するこずです探玢䞭。 たた、グラフにはすべおの倀の組み合わせが必芁です。 ただし、すべおのグルヌプに察しお0の因子レベルを持぀必芁はありたせん。たずえば、すべおの組み合わせがないず棒グラフを積み重ねるこずはできたせん。 ただし、デヌタに存圚しない因子倀は必芁ありたせん。スタックするず0になり、凡䟋には空の倀になりたす。

必芁に応じお、グルヌプ化埌の0ケヌスをフィルタリングする方がはるかに簡単か぀盎感的であるため、すべおの倀をgroup_byに展開するこずがデフォルトであるず思いたす。 .drop匕数は必芁ないず思いたす。なぜなら、埌の0ケヌスをフィルタリングするのは簡単だからです。 他の関数に远加の匕数を䜿甚しないので、これは型を壊したす。 デフォルトでは、group_byに基づいお既存の倀のすべおの組み合わせの結果を衚瀺する必芁がありたす。

これが正しいデフォルトの動䜜になるず思いたす。 ここで、䞀意は、すべおの因子レベルではなく、因子の既存の倀のみを拡匵したす。 これは、0個の倀をドロップするgroup_byを実行した埌に実行するものです

## Expand data so plot groups works correctly
  df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
    left_join(df, by=c("name","group")) %>%
    mutate(
      measure = ifelse(is.na(measure),0,measure)
    )

すべおのグルヌプにれロがあったずしおも、倀が必芁な堎所を確認できる唯䞀のケヌスは、時間デヌタの堎合です。 たぶん、デヌタの1日が途䞭のどこかで欠萜しおいたす。 ここでは、日付範囲での展開ず結合が匕き続き必芁です。 因子レベルの堎合は適甚されたせん。 デヌタクランチャヌが䞍足しおいる日付を自分で凊理するのは公平だず思いたす。

このラむブラリでの玠晎らしい䜜業に感謝したす。 私の仕事の90はdplyrを䜿甚しおいたす。 

@huftisに匷く同意したす。

レベルの削陀たたはレベルの組み合わせは、デヌタずは䜕の関係もないず思いたす。 小さなサンプルを䜿甚しお、関数たたは図のプロトタむプを䜜成しおいる可胜性がありたす。 たたは、split-apply-combine操䜜を実行したす。この堎合、各グルヌプの出力が他のすべおのグルヌプず䞀臎するこずを保蚌する必芁がありたす。

私の立堎を和らげるグルヌプ化倉数がすでに適切な因子である堎合ず、因子を匷制されおいる堎合で、デフォルトの動䜜が異なるかどうかを怜蚎する䟡倀があるず思いたす。 匷制の堎合、未䜿甚のレベルを維持する矩務が少なくなる可胜性があるこずがわかりたす。 しかし、私が䜕かを芁因ずしお蚭定し、レベルを制埡するのに苊劎した堎合...通垞は正圓な理由があり、それを維持するために絶えず戊うこずはしたくありたせん。

参考たでに、この機胜も芋たいです。 @huftisで説明されおいるのず同様のシナリオがあり、必芁な結果を埗るにはフヌプを飛び越えなければなりたせん。

SOからここに来たした。 これは、「tidyr」のcompleteが圹立぀はずです。

はい、そうです。 私は実際に最近「完党」に぀いお孊びたした、そしおそれは思慮深い方法でこれを達成するようです。

SQLバック゚ンドにそれを実装するこずは、デフォルトですべおのグルヌプを削陀するため、難しいように芋えたす。 それをそのたたにしお、SQL甚にtidyr :: completeを実装したせんか

私はこの問題がすでに存圚しおいるこずに気づかずに問題3033を䜜成したした-重耇に぀いおお詫びしたす。 私自身の謙虚な提案を远加するために、私は珟圚、この問題の回避forcats::fct_count()ずしおpull()ずforcats::fct_count()しおいたす。

fct_count()は、垞に入力ず同じ型の出力を䜜成するずいう敎然ずした原則を裏切っおいるため぀たり、この関数はベクトルからティブルを䜜成したす、私はこのメ゜ッドのファンではありたせん。出力の列の名前を倉曎したす。 これにより、 dplyr::count()が1぀をカバヌするこずを意図しおいた堎合、3぀のステップ pull() %>% fct_count() %>% rename() が䜜成されたす。 forcats::fct_count()ずdplyr::count()なんらかの方法で統合し、 forcats::fct_count()を廃止できれば玠晎らしいず思いたす。

tidyr::complete()は芁因に察しお機胜したすか

すべおの因子レベルおよび因子レベルの組み合わせは、デフォルトで保持する必芁がありたす。 この動䜜は、 drop 、 expandなどのパラメヌタで制埡できたす。したがっお、 dplyr::count()のデフォルトの動䜜は次のようになりたす。

df <- data.frame(x = 1:2, y = factor(c(1, 1), levels = 1:2))
df %>% dplyr::count(x, y)
#>  # A tibble: 4 x 3
#>       x        y       n
#>     <int>   <fct>    <int>
#> 1     1        1       1
#> 2     2        1       1
#> 3     1        2       0
#> 4     2        2       0

長さがれロのグルヌプグルヌプの組み合わせは、埌でフィルタリングできたす。 しかし、探玢的分析のためには、党䜓像を芋る必芁がありたす。

  1. この問題の解決策に関するステヌタスの曎新はありたすか
  2. この問題を完党に解決する蚈画はありたすか

2はい間違いなく
1この問題には技術的な実装䞊の問題がいく぀かありたすが、数週間以内に調査したす。

次のように、事埌にデヌタを拡匵するこずでこれを回避できる可胜性がありたす。

library(tidyverse)

truly_group_by <- function(data, ...){
  dots <- quos(...)
  data <- group_by( data, !!!dots )

  labels <- attr( data, "labels" )
  labnames <- names(labels)
  labels <- mutate( labels, ..index.. =  attr(data, "indices") )

  expanded <- labels %>%
    tidyr::expand( !!!dots ) %>%
    left_join( labels, by = labnames ) %>%
    mutate( ..index.. = map(..index.., ~if(is.null(.x)) integer() else .x ) )

  indices <- pull( expanded, ..index..)
  group_sizes <- map_int( indices, length)
  labels <- select( expanded, -..index..)

  attr(data, "labels")  <- labels
  attr(data, "indices") <- indices
  attr(data, "group_sizes") <- group_sizes

  data
}

df  <- data_frame(
  x = 1:2,
  y = factor(c(1, 1), levels = 1:2)
)
tally( truly_group_by(df, x, y) )
#> # A tibble: 4 x 3
#> # Groups:   x [?]
#>       x y         n
#>   <int> <fct> <int>
#> 1     1 1         1
#> 2     1 2         0
#> 3     2 1         1
#> 4     2 2         0
tally( truly_group_by(df, y, x) )
#> # A tibble: 4 x 3
#> # Groups:   y [?]
#>   y         x     n
#>   <fct> <int> <int>
#> 1 1         1     1
#> 2 1         2     1
#> 3 2         1     0
#> 4 2         2     0

明らかに将来的には、これは内郚で凊理され、tidyrたたはpurrrを䜿甚する必芁はありたせん。

これは、元の質問を凊理しおいるようです。

> df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
> df$b = factor(df$b, levels=1:3)
> df %>%
+   group_by(b) %>%
+   summarise(count_a=length(a), .drop=FALSE)
# A tibble: 2 x 3
  b     count_a .drop
  <fct>   <int> <lgl>
1 1           6 FALSE
2 2           6 FALSE
> df %>%
+   truly_group_by(b) %>%
+   summarise(count_a=length(a), .drop=FALSE)
# A tibble: 3 x 3
  b     count_a .drop
  <fct>   <int> <lgl>
1 1           6 FALSE
2 2           6 FALSE
3 3           0 FALSE

ここでの鍵はこれです

 tidyr::expand( !!!dots ) %>%

これは、倉数が芁因であるかどうかに関係なく、すべおの可胜性を拡倧するこずを意味したす。

私たちはどちらかだず思いたす

  • drop=FALSEずきにすべお展開し、長さ0のグルヌプがたくさんある可胜性がありたす
  • drop=TRUE堎合、今行っおいるこずを実行したす

おそらくドロップネスを切り替える機胜がありたす。

これは、メタデヌタの操䜜のみが含たれるため、比范的安䟡な操䜜です。したがっお、最初にRでこれを行う方がリスクが少ないのではないでしょうか。

もしかしおcrossing()の代わりにexpand() 

内郚を芋お、これを実珟するために、 build_index_cpp() 、特にlabelsデヌタフレヌムの生成を「倉曎するだけ」でよいこずに同意したすか

drop = FALSE芁玠のみを拡匵するこずから始められたすか 私は「自然な」構文を怜蚎したしたが、これは最終的には混乱しすぎるかもしれたせんそしおおそらく十分に匷力ではありたせん

group_by(data, crossing(col1, col2), col3)

意味すべおの組み合わせを䜿甚しおcol1ずcol2しお、そしおそこに既存の組み合わせcol3 。

はい、これはbuild_index_cppず、抌し぀ぶしたい属性labels 、 indices 、 group_sizesの生成にのみ圱響するず思いたす。 3489の䞀郚ずしおの敎頓された構造

この議論の「唯䞀の拡倧芁因」の郚分は、非垞に時間がかかったものです。

これらの結果はどうなるでしょうか。

library(dplyr)

d <- data_frame(
  f1 = factor( rep( c("a", "b"), each = 4 ), levels = c("a", "b", "c") ),
  f2 = factor( rep( c("d", "e", "f", "g"), each = 2 ), levels = c("d", "e", "f", "g", "h") ),
  x  = 1:8,
  y  = rep( 1:4, each = 2)
)

f <- function(data, ...){
  group_by(data, !!!quos(...))  %>%
    tally()
}
f(d, f1, f2, x)
f(d, x, f1, f2)

f(d, f1, f2, x, y)
f(d, x, f1, f2, y)

行の順序を無芖するず、 f(d, f1, f2, x)はf(d, x, f1, f2)ず同じ結果になるはずです。 他の2぀に぀いおも同じです。

たた興味深い

f(d, f2, x, f1, y)
d %>% sample_frac(0.3) %>% f(...)

ファクタヌに察しおのみ完党拡匵を実装するずいうアむデアが奜きです。 文字以倖のデヌタ論理を含むの堎合、それぞれのデヌタ型を継承する因子のようなクラスを定矩/䜿甚できたす。 おそらくforcatsによっお提䟛され

3492で進行䞭の実装

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )

( res1 <- tally(group_by(df,f,x, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups:   f [?]
#>   f         x     n
#>   <fct> <dbl> <int>
#> 1 1        1.     1
#> 2 1        2.     1
#> 3 1        4.     0
#> 4 2        1.     1
#> 5 2        2.     0
#> 6 2        4.     1
#> 7 3        1.     0
#> 8 3        2.     0
#> 9 3        4.     0
( res2 <- tally(group_by(df,x,f, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups:   x [?]
#>       x f         n
#>   <dbl> <fct> <int>
#> 1    1. 1         1
#> 2    1. 2         1
#> 3    1. 3         0
#> 4    2. 1         1
#> 5    2. 2         0
#> 6    2. 3         0
#> 7    4. 1         0
#> 8    4. 2         1
#> 9    4. 3         0

all.equal( res1, arrange(res2, f, x) )
#> [1] TRUE

all.equal( filter(res1, n>0), tally(group_by(df, f, x)) )
#> [1] TRUE
all.equal( filter(res2, n>0), tally(group_by(df, x, f)) )
#> [1] TRUE

reprexパッケヌゞv0.2.0によっお2018-04-10に䜜成されたした。

complete()が問題を解決するかどうかに぀いおは、いいえ、そうではありたせん。 蚈算される芁玄が䜕であれ、空のベクトルでのそれらの動䜜は、事埌にパッチを圓おるのではなく、保持する必芁がありたす。 䟋えば

data.frame(x=factor(1, levels=1:2), y=4:5) %>%
     group_by(x) %>%
     summarize(min=min(y), sum=sum(y), prod=prod(y))
# Should be:
#> x       min   sum  prod
#> 1         4     9    20
#> 2       Inf     0     1

sumずprod および皋床は少ないですがmin およびその他のさたざたな関数は、空のベクトルに察しお非垞に明確に定矩されたセマンティクスを持っおいたす。その埌、 complete()を䜿甚しお、これらの動䜜を再定矩したす。

@kenahooわかりたせん。 これは、珟圚の開発バヌゞョンで埗られるものです。 したがっお、取埗できないのはmin()からの譊告だけです。

library(dplyr)

data.frame(x=factor(1, levels=1:2), y=4:5) %>%
  group_by(x) %>%
  summarize(min=min(y), sum=sum(y), prod=prod(y))
#> # A tibble: 2 x 4
#>   x       min   sum  prod
#>   <fct> <dbl> <int> <dbl>
#> 1 1         4     9    20
#> 2 2       Inf     0     1

min(integer())
#> Warning in min(integer()): no non-missing arguments to min; returning Inf
#> [1] Inf
sum(integer())
#> [1] 0
prod(integer())
#> [1] 1

reprexパッケヌゞv0.2.0によっお2018-05-15に䜜成されたした。

@romainfrancoisかっこいい、私はあなたがすでにこの実装に

この叀い問題は自動的にロックされおいたす。 関連する問題を芋぀けたず思われる堎合は、新しい問題をreprexを䜿甚しお提出し、この問題にリンクしおください。 https://reprex.tidyverse.org/

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡