كيفية القيام ببيانات بيانات دمج
-
19-09-2019 - |
سؤال
ملاحظة: تشير هذا السؤال والإجابات التالية إلى إصدارات البيانات. 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')]