لا يزال بإمكانك الاستخدام tapply
هنا:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
سؤال
آسف ، الناس ، لا أستطيع رؤية الغابة للأشجار. لقد بحثت كثيرًا لكنني لم أتمكن من العثور على حل. أريد ، على سبيل المثال ، الوسط لكل وحدة (يحتمل أن يكون 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))