حدد صفوفًا بأكبر قيمة متغير داخل مجموعة في R
-
26-09-2019 - |
سؤال
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
r<-sapply(split(a.3,a.2),function(x) which.max(x$b.2))
a.3[r,]
إرجاع فهرس القائمة ، وليس الفهرس للبيانات بأكملها
أنا أحاول إرجاع أكبر قيمة b.2
لكل مجموعة فرعية من a.2
. كيف يمكنني القيام بذلك بكفاءة؟
المحلول
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
إن الإجابة التي أجراها جوناثان تشانغ تحصل على ما طلبته صراحة ، لكنني أعتقد أنك تريد الصف الفعلي من إطار البيانات.
sel <- ave(b.2, a.2, FUN = max) == b.2
a.3[sel,]
نصائح أخرى
ال ddply
و ave
كما أعتقد أن المقاربات كثيفة الموارد إلى حد ما. ave
يفشل عن طريق نفاد الذاكرة لمشكلتي الحالية (67،608 صف ، مع تحديد أربعة أعمدة المفاتيح الفريدة). tapply
هو خيار مفيد ، لكن ما أحتاج إلى القيام به عمومًا هو تحديد جميع الصفوف بأكملها مع قيمة شيء ما لكل مفتاح فريد (عادة ما يتم تعريفه بواسطة أكثر من عمود واحد). أفضل الحلول التي وجدتها هي القيام برمجة ثم استخدام نفي duplicated
لتحديد الصف الأول فقط لكل مفتاح فريد. للحصول على مثال بسيط هنا:
a <- sample(1:10,100,replace=T)
b <- sample(1:100,100,replace=T)
f <- data.frame(a, b)
sorted <- f[order(f$a, -f$b),]
highs <- sorted[!duplicated(sorted$a),]
أعتقد أن الأداء يكتسب ave
أو ddply
, ، على الأقل ، كبيرة. إنه أكثر تعقيدًا قليلاً لمفاتيح العمود المتعدد ، ولكن order
سوف يتعامل مع مجموعة كاملة من الأشياء لفرزها و duplicated
يعمل على إطارات البيانات ، لذلك من الممكن الاستمرار في استخدام هذا النهج.
library(plyr)
ddply(a.3, "a.2", subset, b.2 == max(b.2))
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
m<-split(a.3,a.2)
u<-function(x){
a<-rownames(x)
b<-which.max(x[,2])
as.numeric(a[b])
}
r<-sapply(m,FUN=function(x) u(x))
a.3[r,]
هذا يفعل الخدعة ، وإن كان مرهقًا إلى حد ما ... لكنه يسمح لي بالاستيلاء على الصفوف لأكبر القيم الجماعية. أي أفكار أخرى؟
> a.2<-sample(1:10,100,replace=T)
> b.2<-sample(1:100,100,replace=T)
> tapply(b.2, a.2, max)
1 2 3 4 5 6 7 8 9 10
99 92 96 97 98 99 94 98 98 96
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
مع aggregate
, ، يمكنك الحصول على الحد الأقصى لكل مجموعة في سطر واحد:
aggregate(a.3, by = list(a.3$a.2), FUN = max)
هذا ينتج الإخراج التالي:
Group.1 a.2 b.2
1 1 1 96
2 2 2 82
...
8 8 8 85
9 9 9 93
10 10 10 97