Data.table: [R-Forge # 5222] 'غير موجود' عند DT [، list (sum (non-.SD-col)، lapply (.SD، mean))، by = ...، .SDcols = ...]

تم إنشاؤها على ٨ يونيو ٢٠١٤  ·  12تعليقات  ·  مصدر: Rdatatable/data.table

المقدم من: مات ويلر ؛ مخصص لـ: لا أحد ؛ رابط R-Forge

عند استخدام .SDcols (لغرض تطبيق دالة على أعمدة متعددة) لا يمكنني الإشارة إلى أعمدة أخرى في الجدول الأصلي (v1) باستخدام الصيغة التالية:

dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,  : 
#   object 'v1' not found

يحدث خطأ مشابه عندما أستخدم c بدلاً من list ، ومن الواضح أن العمود v1 لا يمكن الوصول إليه ضمن جملة j .

لقد لجأت إلى الكود التالي الذي يتضمن العمود v1 ، على الرغم من أنني لا أريد تضمين ذلك في الجزء lapply ، مع الاضطرار إلى إفلاته بعد الحساب.

sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]

وفقًا لـ eddi on Stackoverflow ، هذا خطأ وقد طلب مني الإبلاغ عنه. لا يمكنني تقديم المزيد من التفاصيل لأنني لست متأكدًا تمامًا من الجزء الذي يعتقد أنه خطأ ، بالنظر إلى الإجابة المقبولة من قبل آرون ومناقشتهم التي تلت ذلك ستسلط الضوء على المكان ولكن تكمن المشكلة.

هنا وظيفة SO ذات الصلة.

High bug

ال 12 كومينتر

متأخر بعض الشيء ، لكن إضافة سؤالي هذا إلى الكومة

لم أفكر في الأمر على أنه خطأ ، فعادة ما أقدم الحقول الإضافية المطلوبة إلى .SDcols ولاحقًا في j أستخدم .SD[, !"total", with=FALSE] لاستبعاد عمود غير مرغوب فيه.

هذا حل آخر جيد ، أتساءل عن اختلاف الأداء مقابل استخدام dt$total . ونعم ، هذا النوع من الرقصات الخط الفاصل بين FR و bug ، IMO.

ارتطام هذا مرة أخرى. يبدو أن هذا يمكن أن يكون إصلاحًا مهمًا للغاية. يبدو أن هذا السؤال مرتبط ويمكن حله عبر DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]

إليك حالة بسيطة أخرى حيث سيكون ذلك مفيدًا: http://stackoverflow.com/a/32498711/1191259

آخر للتحديث عند الإصلاح: http://stackoverflow.com/q/32915770/1191259

ياي! يمكننا الآن القيام بذلك:

require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
  #  grp v1  v2   v3
# 1:   2  7 4.5 12.5
# 2:   3 12 4.0 13.0
# 3:   1  9 3.5 13.5

تم تحديث جميع مشاركات SO المرتبطة هنا. شكرا للجميع.

شكرا لكarunsrinivasan. كنت أنتظر هذا الإصلاح لمدة عامين.

رائع! شكرا لك

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات