حدد صفوفًا بأكبر قيمة متغير داخل مجموعة في R

StackOverflow https://stackoverflow.com/questions/2822156

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top