سؤال

ملاحظة: تشير هذا السؤال والإجابات التالية إلى إصدارات البيانات. v. تم إصدار 1.5.3 في فبراير 2011 لحل هذه المشكلة. انظر المزيد من العلاج الأخير (03-2012): ترجمة SQL ينضم إلى مفاتيح أجنبية إلى R Data.Table بناء جملة


لقد حفر من خلال الوثائق ل حزمة البيانات (بديل للبيانات. الإطار هذا أكثر كفاءة بكثير لعمليات معينة)، بما في ذلك عرض Josh Reich على SQL و Data.Table في ميتوب NYC R (PDF)، ولكن لا يمكن معرفة هذه العملية تافهة تماما.

> x <- DT(a=1:3, b=2:4, key='a')
> x
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
     a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
  a b c
1 1 2 a
2 2 3 b
3 3 4 c

يقول المستندات "عندما [الحجة الأولى] هي نفسها بيانات. من الواضح أن هذا ليس هو الحال. هل يمكنني الحصول على الأعمدة الأخرى من Y في نتيجة X [Y] مع البيانات. يبدو أنه مجرد أخذ صفوف X حيث يطابق المفتاح مفتاح ذ، ولكنه يتجاهل بقية ص كليا ...

هل كانت مفيدة؟

المحلول

أنت تقتبس عن الجزء الخطأ من الوثائق. إذا كان لديك نظرة على وثيقة [.data.table سوف تقرأ:

عندما أكون بيانات. لا يمكن أن يكون x، x مفتاح، يعني الانضمام إلى x و إرجاع الصفوف في x هذا المباراة. وبعد يتم إجراء إيصال Equi بين كل عمود في I لكل عمود في مفتاح X بالترتيب. هذا يشبه وظيفة BEST R الخاصة بوضع مصفوفة من مصفوفة عمود 2، وفي أبعاد أعلى تضمن مجموعة صفيف N- الأبعاد بواسطة مصفوفة عمود N

أعترف بوصف الحزمة (الجزء الذي نقلت عنه) مربكة إلى حد ما، لأنه يبدو أنه يقول أن [" قد يتم استخدامه بدلا من الدمج. لكنني أعتقد أن ما تقوله هو: إذا كانت x و y كلاهما البيانات. لا نستخدم الانضمام على فهرس (الذي تم استدعاء مثل الدمج) بدلا من البحث الثنائي.


شيء اخر:

بيانات البيانات التي قمت بتثبيتها install.packages كان في عداد المفقودين merge.data.table method, ، لذلك باستخدام merge سوف يتصل merge.data.frame. وبعد بعد تثبيت حزمة من R-Forge ص مستعملة أسرع merge.data.table طريقة.

يمكنك التحقق مما إذا كان لديك طريقة Merge.Data.table عن طريق التحقق من إخراج:

methods(generic.function="merge")

تحرير [إجابة لم تعد صالحة]: يشير هذا الإجابة إلى البيانات. الإصدار 1.3. في الإصدار 1.5.3 سلوك البيانات. غير القابل للتغيير و X [Y] بإرجاع النتائج المتوقعة. شكرا لك ماثيو دولي, ، مؤلف البيانات. لا يمكن إثبات ذلك في التعليقات.

نصائح أخرى

شكرا على الإجابات. فاتني هذا الموضوع عندما تم نشره في الأصل. البيانات. قد انتقلت منذ فبراير. 1.4.1 تم إصداره إلى Cran منذ فترة وسرعة 1.5 قريبا. على سبيل المثال تم استبدال الاسم المستعار DT () مع قائمة ()؛ باعتبارها بدائية أسرع بكثير، والبيانات. لا يمكن أن يرث الآن من data.frame لذلك يعمل مع الحزم التي فقط قبول data.frame مثل Ggplot وشبكة شعرية، دون أي تحويل مطلوب (أسرع وأكثر ملاءمة).

هل من الممكن الاشتراك في Data.Table Tag حتى أحصل على بريد إلكتروني عندما ينشر شخص ما سؤالا بهذه العلامة؟ نمت قائمة "DataTable-Help" إلى حوالي 30-40 رسالة شهرية، لكنني سعداء بالإجابة هنا أيضا إذا كان بإمكاني الحصول على نوع من الإخطار.

ماثيو.

أعتقد أن استخدام base::merge ليست هناك حاجة الدالة، كما تستخدم data.table البصل يمكن أن يكون أسرع بكثير. على سبيل المثال انظر ما يلي. انا اصنع x و y البيانات. مع 3-3 أعمدة:

x <- data.table( foo = 1:5, a=20:24, zoo = 5:1 )
y <- data.table( foo = 1:5, b=30:34, boo = 10:14)
setkey(x, foo)
setkey(y, foo)

ودمج كل من مع base:merge و data.table ينضم إلى رؤية سرعة عمليات الإعدام:

system.time(merge(x,y))
##    user  system elapsed 
##   0.027   0.000   0.023 

system.time(x[,list(y,x)])
##    user  system elapsed 
##   0.003   0.000   0.006 

النتائج ليست متطابقة، حيث أن هذا الأخير لديه عمود إضافي واحد:

merge(x,y)
##      foo  a zoo  b boo
## [1,]   1 20   5 30  10
## [2,]   2 21   4 31  11
## [3,]   3 22   3 32  12
## [4,]   4 23   2 33  13
## [5,]   5 24   1 34  14

x[,list(x,y)]
##      foo  a zoo foo.1  b boo
## [1,]   1 20   5     1 30  10
## [2,]   2 21   4     2 31  11
## [3,]   3 22   3     3 32  12
## [4,]   4 23   2     4 33  13
## [5,]   5 24   1     5 34  14

التي لا يمكن أن تجعل مشكلة كبيرة :)

أعتقد أن F3Lix صحيحة وأن الوثائق مضللة قليلا. الفائدة في القيام بعملية سريعة إلى مجموعة فرعية البيانات. ما زلت بحاجة في النهاية إلى استخدام merge وظيفة بعد ذلك كما هو الحال في مثال الخاص بك أعلاه.

سوف ترى في عرض Josh حول استخدام البيانات. أن هذا هو كيف يعمل مثاله. هو أولا فراجع واحدة من البيانات. ثم يقوم بدمج:

library(data.table)
sdt <- DT(series, key='series_id')
ddt <- DT(data, key='series_id')
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ]
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all']
data <- merge(d,series)[,c('title','min','mean','max')]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top