عد لا. من التواريخ لكل معرف بعد المباراة

أرغب في إنشاء عمود (res) في DF1 يسرد عددًا (والذي سيكون تنازليًا) لكل معرف. سيطابق هذا العمود التاريخ "ب" والتاريخ "ج" عدد التعدادات C (من DF2) أكبر من dateA. سيكون هناك المزيد من التواريخ في التاريخ ج لكل معرف من التاريخ ب.

DF1

ID  date A      date B
17  27/06/12    26/07/12
17  21/02/13    21/02/13
17  23/01/14    23/01/14
17  5/02/15     5/02/15
17  28/11/16    16/06/16 
18  25/07/13    22/05/13
18  29/10/14    1/12/14
18  11/05/15    1/12/14
21  27/09/12    16/07/12
21  25/07/14    11/08/14
21  15/07/15    24/02/15

DF2

ID  date C
17  09/02/12
17  26/07/12
17  21/02/13
17  23/01/14
17  19/06/14
17  24/07/14
17  5/02/15
17  26/02/15
17  28/05/15
17  20/08/15
17  24/03/16
17  16/06/16
18  22/05/13
18  16/10/13
18  5/05/14
18  1/12/14
21  16/07/12
21  27/05/13
21  10/02/14
21  11/08/14
21  24/02/15

df1 مع إضافة عمود جديد:

DF1
ID  date A      date B     res
17  27/06/12    26/07/12    11
17  21/02/13    21/02/13    9
17  23/01/14    23/01/14    8
17  5/02/15     5/02/15     5
17  28/11/16    16/06/16    0 
18  25/07/13    22/05/13    3
18  29/10/14    1/12/14     1
18  11/05/15    1/12/14     0
21  27/09/12    16/07/12    4
21  25/07/14    11/08/14    2
21  15/07/15    24/02/15    0
0
يرجى الامتناع عن إعطاء أسماء col مع مسافات فيها
وأضاف المؤلف David Arenburg, مصدر

1 إجابة

تعتبر حزمة data.table مناسبة جدًا لهذا النوع من الصلات غير المتساوية.

df1[, res:=0L][match(df2$dateC, dateB), 
    res := df2[.SD, on=.(ID, dateC > dateA), .N, by=.EACHI]$N]
df1

في التعليمة البرمجية المذكورة أعلاه ، قم بتهيئة النتيجة إلى 0.

ثم ، أنت subset df1 عن طريق مطابقة القيم بين dateB و dateC .

Then you join the subseted df1 with df2 using ID and dateC > dateA.

لكل صف من df1 (على سبيل المثال .EACHI ) ، قم بإرجاع عدد الصفوف.

بما أن النتائج عبارة عن data.table ، فسيُرجع $ N العمود المسمى N بعد الحساب.

أو بدلاً من ذلك ، باستخدام equi-join

df1[, res:=0L][df2, on=.(ID, dateB=dateC), 
    res := df2[.SD, on=.(ID, dateC > dateA), .N, by=.EACHI]$N][]

البيانات:

library(data.table)

df1 <- fread("ID  dateA      dateB
17  27/06/12    26/07/12
17  21/02/13    21/02/13
17  23/01/14    23/01/14
17  5/02/15     5/02/15
17  28/11/16    16/06/16 
18  25/07/13    22/05/13
18  29/10/14    1/12/14
18  11/05/15    1/12/14
21  27/09/12    16/07/12
21  25/07/14    11/08/14
21  15/07/15    24/02/15")
cols <- c("dateA", "dateB")
df1[, (cols) := lapply(.SD, as.Date, format="%d/%m/%y"), .SDcols=cols]

df2 <- fread("ID  dateC
17  09/02/12
17  26/07/12
17  21/02/13
17  23/01/14
17  19/06/14
17  24/07/14
17  5/02/15
17  26/02/15
17  28/05/15
17  20/08/15
17  24/03/16
17  16/06/16
18  22/05/13
18  16/10/13
18  5/05/14
18  1/12/14
21  16/07/12
21  27/05/13
21  10/02/14
21  11/08/14
21  24/02/15")
df2[, dateC := as.Date(dateC, "%d/%m/%y")]
0
وأضاف
شكرا لك chinsoon وDavid Arenburg ، وهذا يعمل جزئيا. ولكنني أيضًا أحصل على "NA" في العمود res. سأقوم بتحميل المزيد من البيانات كمثال لمعرفة ما إذا كان ذلك يساعد
وأضاف المؤلف sar, مصدر
sar ستحصل على NA في حالة عدم وجود تطابق بين dateC و dateB الأعمدة. على سبيل المثال ، في بياناتك الجديدة ، في الصف # 8 df1 لا يوجد تاريخ مطابقة في df2 $ dateC إلى df1 $ dateB
وأضاف المؤلف David Arenburg, مصدر
sar في كلتا الحالتين ، يمكنك بسهولة استبدال NAs بالأصفار عن طريق القيام df1 [is.na (res)، res: = 0]
وأضاف المؤلف David Arenburg, مصدر