مرحبا. إنني في حيرة من أمري من سلوك 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
إنه مختلف عن الأدوات الأخرى وكنت أتساءل ما هو التفسير أو ما إذا كنت أفعل شيئًا خاطئًا (أو إذا كان هذا خطأ). لقد قمت بتضمين مقارنة مع 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
التعليق الأكثر فائدة
شكرًا لك @ franknarf1 و jangorecki على الرد ومؤشر الأسئلة الشائعة.
بعد قراءة إجابة الأسئلة الشائعة وإجراء المزيد من الاختبارات ، يبدو أنه يتعين عليك توخي الحذر الشديد في كيفية استخدام متغيرات التجميع ، حيث يمكن أن يؤدي التجميع في أعمدة مختلفة ببيانات متطابقة إلى نتائج مختلفة ، اعتمادًا على ما تم استخدامه للتجميع. ما زلت أجد هذا غريبًا ومحرجًا بعض الشيء ، لكن ربما هذا مجرد شيء أحتاج إلى التعود عليه.
أمثلة:
نتيجة ما سبق: المجموع أ = 1
نتيجة ما سبق: TotalB = 3
لا توجد نتيجة ، فشل التنفيذ بسبب الخطأ:
خطأ في gsum (SomeNumberA): الكائن "SomeNumberA" غير موجود