سؤال

آسف ، الناس ، لا أستطيع رؤية الغابة للأشجار. لقد بحثت كثيرًا لكنني لم أتمكن من العثور على حل. أريد ، على سبيل المثال ، الوسط لكل وحدة (يحتمل أن يكون rowMeans) لمجموعة فرعية من المتغيرات في مصفوفة (أو من المحتمل أن تكون ملف بيانات) في R. أرغب في تحديد الأعمدة باستخدام متجه الفهرسة كما في tapply, التي اتصلت بها a1 في المثال أدناه.

> set.seed(23958)
> (dat <- matrix(sample(0:3, 10, replace = TRUE), ncol = 5))
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    3    0    2    1
[2,]    2    1    1    2    1

> set.seed(6112)
> (a1 <- sample(1:2, 5, replace = TRUE))
[1] 1 1 2 2 1

يجب أن يبدو الحل في هذا المثال هكذا ، لكن بالطبع أود أن أفعل ذلك بطريقة أكثر شمولاً. كنت أفكر في أنني يجب أن أستخدم وظيفة من apply الأسرة ، لكنني لم أستطع معرفة أي واحد.

> cbind(rowMeans(dat[, a1 == 1]), rowMeans(dat[, a1 == 2]))
         [,1] [,2]
[1,] 2.000000  1.0
[2,] 1.333333  1.5
هل كانت مفيدة؟

المحلول

لا يزال بإمكانك الاستخدام tapply هنا:

do.call(rbind,
          tapply(seq_len(ncol(dat)),a1,
           function(i)rowMeans(dat[,i])))

نصائح أخرى

اذا أنت tفصوص بياناتك ، يمكنك استخدامها by:

t(do.call(rbind,by(t(dat),a1,colMeans)))
          1   2
V1 2.000000 1.0
V2 1.333333 1.5

يمكنك أيضا استخدام aggregate وظيفة:

t(aggregate(t(dat), list(a1), mean))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top