Dplyr: الحفاظ على المجموعات ذات الطول الصفري

تم إنشاؤها على ٢٠ مارس ٢٠١٤  ·  44تعليقات  ·  مصدر: tidyverse/dplyr

http://stackoverflow.com/questions/22523131

لست متأكدًا من الواجهة التي يجب أن تكون عليها - ربما يجب أن يتم إسقاطها افتراضيًا = FALSE.

feature wip

التعليق الأكثر فائدة

+1 - يعد هذا بمثابة كسر للصفقة للعديد من التحليلات

ال 44 كومينتر

شكرا لفتح هذه القضية هادلي.

: +1: واجهت نفس المشكلة اليوم ، drop = FALSE ستكون مساعدة كبيرة بالنسبة لي!

أي فكرة عن الإطار الزمني لوضع .drop = FALSE مكافئ في dplyr؟ أحتاج إلى هذا لبعض rCharts للعرض بشكل صحيح.

في هذه الأثناء ، حصلت على الإجابة في رابط العمل الخاص بك.
http://stackoverflow.com/questions/22523131

لقد جمعت حسب متغيرين.

+1 لخيار عدم إسقاط مجموعات فارغة

قد يتداخل بعض الشيء مع # 486 و # 413.

إن عدم إسقاط مجموعات فارغة سيكون مفيدًا جدًا. غالبًا ما تكون مطلوبة عند إنشاء جداول موجزة.

+1 - يعد هذا بمثابة كسر للصفقة للعديد من التحليلات

أنا أتفق مع كل ما سبق - سيكون مفيدًا جدًا.

romainfrancois حاليًا build_index_cpp() لا يحترم خاصية الإسقاط:

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))

تنطبق سمة الإسقاط فقط عند التجميع حسب عامل ، وفي هذه الحالة نحتاج إلى مجموعة واحدة لكل مستوى عامل ، بغض النظر عما إذا كان المستوى ينطبق بالفعل على البيانات أم لا.

سيؤثر هذا أيضًا على أفعال الجدول الفردي بالطرق التالية:

  • 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 ، انتهى بي الأمر بـ 6 مجموعات (2x3) حيث تكون المجموعات (2, 2) و (2,3) فارغة. هذا حسن. يمكنني إدارة ما أعتقد.

الآن ، ماذا لو كان لدي هذا:

> 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 . ماذا ستكون المجموعات؟ تضمين التغريدة

يُرجع كل من 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 ، حتى لا يتغير السلوك الافتراضي ، أعد اقتراح

حسنًا ، من الصعب أن ألتف حول ما يجب أن يكون عليه السلوك بالضبط. هل تبدو هذه التجارب الفكرية البسيطة صحيحة؟

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 ). وأعتقد أن الحفاظ على المجموعات الفارغة أمر منطقي حتى عند التجميع حسب عدة متغيرات. على سبيل المثال ، إذا كانت المتغيرات sex ( male و female ) و answer (في استبيان ، مع المستويات disagree ، neutral ، agree ) ، وأردت حساب تكرار كل إجابة لكل جنس (على سبيل المثال لجدول ، أو للتخطيط لاحقًا) ، فلن ترغب في إسقاط فئة الإجابة فقط لأنه لم تجبه أي إناث.

أتوقع أيضًا أن تظل متغيرات العوامل متغيرات العامل في data_frame الناتج (لم يتم تحويله إلى سلاسل) ، ومع _المستويات الأصلية_. (لذلك عند رسم البيانات ، ستكون فئات الإجابات بالترتيب الصحيح ، وليس الترتيب الأبجدي agree ، disagree ، neutral ).

بالنسبة لمثالك الأخير ، سيكون من الطبيعي _ في بعض الحالات_ إسقاط المتغير sex (على سبيل المثال ، إذا _ عن قصد _ لم يتم مسح أي إناث) ، و _ في حالات أخرى_ لا (على سبيل المثال ، عند حساب عدد العيوب الخلقية المقسمة حسب الجنس (وربما السنة)). ولكن يمكن (ويجب) التعامل مع هذا بسهولة مع _ بعد_ تجميع البيانات. (قد يكون الحل المختلف هو قبول وسيطة _vector-valued_ .drop . سيكون ذلك رائعًا ، لكن أعتقد أنه قد يعقد الأمور؟)

(سيكون الحل المختلف هو قبول حجة .drop ذات قيمة متجهية. سيكون ذلك رائعًا ، لكن أعتقد أنه قد يعقد الأمور؟)

نعم ، ربما تكون معقدة للغاية. وإلا فأنا أتفق مع تعليقات huftis .

تضمين التغريدة
أظن
نعم ، قم بتوسيع جميع مجموعات القيم إلى group_by إذا كانت موجودة في البيانات.
لا ، لا تتوسع في مستويات العوامل غير الموجودة.

حالة الاستخدام الأكثر شيوعًا لدي هي إعداد مجموعة من البيانات الملخصة لمخطط (أثناء الاستكشاف). ويجب أن تحتوي المخططات على جميع مجموعات القيم. لكنهم لا يحتاجون إلى مستويات عامل تحتوي على 0 لجميع المجموعات .. على سبيل المثال ، لا يمكنك تكديس مخطط شريطي بدون كل التركيبات. لكنك لا تحتاج إلى قيم عوامل غير موجودة في البيانات ، فهذه ستكون 0 فقط عند تكديسها وقيمة فارغة في وسيلة الإيضاح.

أعتقد أن توسيع جميع القيم إلى group_by يجب أن يكون الإعداد الافتراضي لأنه من الأسهل (والأكثر بديهية) تصفية 0 حالة بعد المجموعة إذا لزم الأمر. لا أعتقد أن وسيطة .drop ضرورية ، لأنه من السهل تصفية 0 حالة بعد ذلك. لا نستخدم حججًا إضافية لأي من الوظائف الأخرى ، لذلك قد يؤدي ذلك إلى كسر القالب. يجب أن يكون الإعداد الافتراضي هو إظهار النتائج لجميع مجموعات القيم الموجودة بناءً على group_by.

أعتقد أن هذا سيكون السلوك الافتراضي الصحيح. هنا سيتم توسيع الفريد فقط على القيم الموجودة في العامل ، وليس جميع مستويات العوامل. (هذا ما أديره بعد تشغيل 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)
    )

الحالة الوحيدة التي يمكنني أن أرى فيها أين تريد قيمة على الرغم من أن جميع المجموعات بها صفر هي بيانات الوقت. ربما ينقص يوم من البيانات في مكان ما في الوسط. هنا لا يزال من الضروري توسيع نطاق التاريخ والانضمام إليه. لن يتم تطبيق حالة مستوى العامل. أعتقد أنه من العدل أن تتعامل أداة تحليل البيانات مع التواريخ المفقودة من تلقاء نفسها.

شكرا لكل عملك الرائع في هذه المكتبة. 90٪ من عملي يستخدم dplyr. :)

أتفق بشدة معhuftis.

لا أعتقد أن انخفاض المستويات أو مجموعات المستويات يجب أن يكون له أي علاقة بالبيانات. قد تقوم بعمل نموذج أولي لوظيفة أو شكل باستخدام عينة صغيرة. أو القيام بعملية تقسيم التطبيق والجمع ، وفي هذه الحالة تريد ضمانًا بأن ناتج كل مجموعة سيكون متوافقًا مع جميع الباقي.

تليين موقفي: أعتقد أنه من الجدير التفكير فيما إذا كان يجب أن يختلف السلوك الافتراضي عندما يكون متغير التجميع بالفعل عاملاً مناسبًا مقابل عندما يتم إجباره على التعامل. أستطيع أن أرى أن الالتزام بالحفاظ على المستويات غير المستخدمة قد يكون أقل في حالة الإكراه. ولكن إذا واجهت مشكلة في إعداد شيء ما كعامل والسيطرة على المستويات ... عادة ما يكون هناك سبب وجيه ولا أريد أن أقاتل باستمرار للحفاظ على ذلك.

لمعلوماتك ، أود أن أرى هذه الميزة أيضًا. لديّ سيناريو مشابه كما وصفه huftis ويجب أن أقفز عبر الأطواق للحصول على النتائج التي

جئت إلى هنا من SO. أليس هذا ما يفترض أن يساعد فيه complete من "tidyr"؟

نعم إنها كذلك. لقد تعلمت للتو عن "كاملة" مؤخرًا ويبدو أنني أنجز ذلك بطريقة مدروسة.

يبدو تنفيذ ذلك لخلفيات SQL أمرًا صعبًا ، لأنها ستسقط افتراضيًا جميع المجموعات. هل نترك الأمر عند هذا الحد وربما ننفذ tidyr :: complete () لـ SQL؟

لقد أنشأت العدد رقم 3033 ولم أدرك أن هذه المشكلة موجودة بالفعل - أعتذر عن التكرار. لإضافة اقتراحي المتواضع ، أستخدم حاليًا pull() و forcats::fct_count() كحل بديل لهذه المشكلة.

أنا لست من المعجبين بهذه الطريقة لأن fct_count() يخون مبدأ ترتيب المخرجات الذي يكون دائمًا من نفس نوع الإدخال (أي أن هذه الوظيفة تخلق إشارة من المتجه) ، ولدي لإعادة تسمية الأعمدة في الإخراج. يؤدي هذا إلى إنشاء 3 خطوات ( pull() %>% fct_count() %>% rename() ) عندما كان من المفترض أن يغطي dplyr::count() واحدة. سيكون من الرائع لو تم دمج 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) ، إذا تم تجاهل ترتيب الصف. نفس الشيء بالنسبة للاثنين الآخرين.

مثير للاهتمام أيضًا:

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

تم إنشاؤه في 2018-04-10 بواسطة حزمة reprex (v0.2.0).

بالنسبة إلى ما إذا كان 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 لست متأكدا من فهمي. هذا ما تحصل عليه مع إصدار dev الحالي. لذا فإن الشيء الوحيد الذي لم تحصل عليه هو التحذير من 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

تم إنشاؤه في 2018-05-15 بواسطة حزمة reprex (v0.2.0).

romainfrancois أوه رائع ، لم أكن أدرك أنك كنت بالفعل حتى الآن على طول هذا التنفيذ. تبدو رائعة!

تم قفل هذه المشكلة القديمة تلقائيًا. إذا كنت تعتقد أنك وجدت مشكلة ذات صلة ، فيرجى تقديم مشكلة جديدة (مع reprex) والارتباط بهذه المشكلة. https://reprex.tidyverse.org/

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات