المقدم من: مات ويلر ؛ مخصص لـ: لا أحد ؛ رابط 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 ذات الصلة.
متأخر بعض الشيء ، لكن إضافة سؤالي هذا إلى الكومة
لم أفكر في الأمر على أنه خطأ ، فعادة ما أقدم الحقول الإضافية المطلوبة إلى .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/questions/32944060/using-data-table-to-calculate-new-columns/32944519#32944519
آخر للتحديث عند الإصلاح: 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. كنت أنتظر هذا الإصلاح لمدة عامين.
رائع! شكرا لك