Data.table: الإجماليات الخاطئة عند التجميع والتجميع حسب نفس العمود؟

تم إنشاؤها على ١٠ أكتوبر ٢٠١٨  ·  4تعليقات  ·  مصدر: Rdatatable/data.table

مرحبا. إنني في حيرة من أمري من سلوك data.table عند التجميع والتجميع في نفس العمود. يبدو أنه يؤدي التجميع (على سبيل المثال المجموع) على البيانات المجمعة ، بدلاً من البيانات غير المجمعة. لا أقول بالضرورة أن هذا خطأ - ولكنه يختلف عن الأدوات الأخرى وكنت أتساءل ما هو التفسير أو ما إذا كنت أفعل شيئًا خاطئًا (أو إذا كان هذا خطأ). لقد قمت بتضمين مقارنة مع dplyr ، والذي يؤدي إلى حد كبير كما أتوقع (وأكثر مثل SQL). ملحوظة: لقد حاولت البحث في المشكلات ، و Stackoverflow ، وما إلى ذلك ، على النحو المطلوب ، ولكن طبيعة هذا السيناريو (تجميع وتجميع نفس العمود) فريدة بعض الشيء ولم أجد أي تطابقات.

# Minimal reproducible example

الرجاء مقارنة عمود "الإجمالي" في المثالين أدناه. على سبيل المثال ، هناك ثلاثة صفوف بالقيمة ثلاثة ، لذلك أتوقع أن يكون الإجمالي 9 وليس 3.

جدول البيانات

library(data.table)
df <- data.frame(SomeNumber=c(1,2,3,1,2,3,1,2,3))
dt <- data.table(df)
r <- dt[, .(.N, Total=sum(SomeNumber)), by=SomeNumber]

النتيجة (ص):

   SomeNumber N Total
1:          1 3     1
2:          2 3     2
3:          3 3     3

dplyr

library(dplyr)
df <- data.frame(SomeNumber=c(1,2,3,1,2,3,1,2,3))
r <- df %>% group_by(SomeNumber) %>% 
  summarise(N=n(), Total=sum(SomeNumber)) %>%
  ungroup()

النتيجة (ص):

   SomeNumber N Total
1:          1 3     3
2:          2 3     6
3:          3 3     9

# Output of sessionInfo()
R الإصدار 3.5.1 (2018-07-02)
النظام الأساسي: x86_64-w64-mingw32 / x64 (64 بت)
يعمل في ظل: Windows> = 8 x64 (الإصدار 9200)

منتجات ماتريكس: الافتراضي

المكان:
[1] LC_COLLATE = English_United Kingdom.1252 LC_CTYPE = English_United Kingdom.1252 LC_MONETARY = English_United Kingdom.1252
[4] LC_NUMERIC = C LC_TIME = English_United Kingdom.1252

الحزم الأساسية المرفقة:
[1] احصائيات الرسومات grDevices وقاعدة طرق مجموعات البيانات

الحزم الأخرى المرفقة:
[1] dplyr_0.7.6 data.table_1.11.8 openxlsx_4.1.0 bindrcpp_0.2.2 pivottabler_0.4.0.9000

تم تحميله عبر مساحة اسم (وغير مرفق):
[1] Rcpp_0.12.19 rstudioapi_0.8 bindr_0.1.1 magrittr_1.5 tidyselect_0.2.4 R6_2.3.0 rlang_0.2.2 fansi_0.3.0 tools_3.5.1
[10] utf8_1.1.4 cli_1.0.1 htmltools_0.3.6 yaml_2.2.0 تؤكد أن_0.2.0 Digest_0.6.17 tibble_1.4.2 crayon_1.3.4 zip_1.0.0
[19] purrr_0.2.5 htmlwidgets_1.3 Glue_1.3.0 compiler_3.5.1 pillar_1.3.0 jsonlite_1.5 pkgconfig_2.0.2

bug question

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

شكرًا لك @ franknarf1 و jangorecki على الرد ومؤشر الأسئلة الشائعة.
بعد قراءة إجابة الأسئلة الشائعة وإجراء المزيد من الاختبارات ، يبدو أنه يتعين عليك توخي الحذر الشديد في كيفية استخدام متغيرات التجميع ، حيث يمكن أن يؤدي التجميع في أعمدة مختلفة ببيانات متطابقة إلى نتائج مختلفة ، اعتمادًا على ما تم استخدامه للتجميع. ما زلت أجد هذا غريبًا ومحرجًا بعض الشيء ، لكن ربما هذا مجرد شيء أحتاج إلى التعود عليه.

أمثلة:

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA)), by=SomeNumberA]

نتيجة ما سبق: المجموع أ = 1

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalB=sum(SomeNumberB)), by=SomeNumberA]

نتيجة ما سبق: TotalB = 3

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA), TotalB=sum(SomeNumberB)), by=SomeNumberA]

لا توجد نتيجة ، فشل التنفيذ بسبب الخطأ:
خطأ في gsum (SomeNumberA): الكائن "SomeNumberA" غير موجود

ال 4 كومينتر

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

داخل j من DT[, j, by] ، يبلغ طول الأعمدة الموجودة في by 1. يمكنك إجراء هذا الحساب مثل .N*SomeNumber ، على الرغم من:

dt[, .(.N, Total=.N*SomeNumber), by=SomeNumber]
# or, for efficiency with GForce...
dt[, .(.N), by=SomeNumber][, Total := N*SomeNumber][]

للحصول على سبب منطقي ، راجع السؤال "داخل كل مجموعة ، لماذا متغيرات المجموعة طول -1؟" داخل الأسئلة الشائعة على vignette("datatable-faq") أو https://github.com/Rdatatable/data.table/wiki/Getting-started

شكرًا لك @ franknarf1 و jangorecki على الرد ومؤشر الأسئلة الشائعة.
بعد قراءة إجابة الأسئلة الشائعة وإجراء المزيد من الاختبارات ، يبدو أنه يتعين عليك توخي الحذر الشديد في كيفية استخدام متغيرات التجميع ، حيث يمكن أن يؤدي التجميع في أعمدة مختلفة ببيانات متطابقة إلى نتائج مختلفة ، اعتمادًا على ما تم استخدامه للتجميع. ما زلت أجد هذا غريبًا ومحرجًا بعض الشيء ، لكن ربما هذا مجرد شيء أحتاج إلى التعود عليه.

أمثلة:

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA)), by=SomeNumberA]

نتيجة ما سبق: المجموع أ = 1

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalB=sum(SomeNumberB)), by=SomeNumberA]

نتيجة ما سبق: TotalB = 3

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA), TotalB=sum(SomeNumberB)), by=SomeNumberA]

لا توجد نتيجة ، فشل التنفيذ بسبب الخطأ:
خطأ في gsum (SomeNumberA): الكائن "SomeNumberA" غير موجود

آخرها خطأ ...

لست متأكدًا مما إذا كان هذا فارقًا بسيطًا في طريقة التجميع / التجميع الخاصة بـ data.table ولكن عند التجميع والتجميع بواسطة متغير واحد ، فإن الجدول لا "يحلل" استدعاء التجميع.

على سبيل المثال ، يتم حساب كل رقم على أنه مجموعة خاصة به بعد التجميع ، لذلك في حالتك لديك فقط 3 SomeNumber متغيرات للجمع ، بدلاً من 9 الأصلية.

الإصلاح السريع والسهل هو ضمان إجراء التحليل إلى عوامل داخل استدعاء التجميع الأولي.

library(data.table)

df <- data.frame(SomeNumber=c(1, 2, 3, 1, 2, 3, 1, 2, 3))

dt <- data.table(df)

r <- dt[, .(.N, Total = sum(SomeNumber)), by = as.factor(SomeNumber)]

   as.factor N Total
1:         1 3     3
2:         2 3     6
3:         3 3     9
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات