كثيرا ما أفعل
DT[CJ(colA = colA, colB = colB, unique=TRUE), on=c("colA","colB")]
# to complete missing levels
# or
DT[, CJ(colA = colA, colB = colB, unique=TRUE)][!DT, on=c("colA","colB")]
# to identify missing levels
# http://stackoverflow.com/a/36065607/1191259
سيكون من الرائع أن أفلت من كتابة colA
و colB
مرات أقل. FR هنا ل
CJ(colA, colB, unique=TRUE, names=TRUE)
لاستنتاج الأسماء colA
و colB
، ربما باستخدام أي طريقة تستخدمها data.frame () و data.table () ( make.names
؟).
(يمكن تقليل تكرار الاسم أكثر إذا كان on=.Icols
شيئًا ، على ما أعتقد ، لكنني سأترك ذلك لـ FR منفصل.)
وظائف SO للتحديث ...
يأخذ CJ
...
كوسيطة أولى ، وستكون هذه الوظيفة طريقة عامة ، لذا AFAIK سنحتاج إلى تغييرها إلى CJ(x, ...)
، يمكن إجراء هذه التغييرات معًا # 1090
+1 ولا أرى الحاجة إلى الوسيطة names
- يجب أن يكون هذا هو السلوك الوحيد. مع تغيير بناء جملة الانضمام إلى استخدام "على" بدلاً من setkey
، أصبح هذا نقطة شائكة كبيرة بالنسبة لي.
أود أيضًا أن أرى unique = TRUE
هو الخيار الافتراضي - لا يمكنني التفكير في _ مطلقًا_ عدم الحاجة إلى تمييز الوسيطات إلى CJ
.
jangorecki لم أتطرق إلى # 1090 / # 814 حتى الآن. أفضل كقائمة بذاتها ، على ما أعتقد ، ما لم أفقد شيئًا ما
التعليق الأكثر فائدة
+1 ولا أرى الحاجة إلى الوسيطة
names
- يجب أن يكون هذا هو السلوك الوحيد. مع تغيير بناء جملة الانضمام إلى استخدام "على" بدلاً منsetkey
، أصبح هذا نقطة شائكة كبيرة بالنسبة لي.أود أيضًا أن أرى
unique = TRUE
هو الخيار الافتراضي - لا يمكنني التفكير في _ مطلقًا_ عدم الحاجة إلى تمييز الوسيطات إلىCJ
.