سؤال

لدي مجموعة بيانات تحتوي على 60 صفًا و3036 عمودًا.لقد قمت بالفعل بحساب الكميات الصفية باستخدام الدالة rowQuantiles من matrixStats طَرد.من هذا حصلت على ناقل العمود [60،1].الآن، أريد أن أختار من كل صف فقط البيانات الأعلى من الصف الكمي.إذا استخدمت الوظيفة التي على النحو التالي:

datset_qu95 = which(dataset > rowQuantiles(dataset, probs=c(0.95))

ثم أفقد أبعاد البيانات وأحصل على مصفوفة فقط بدلاً من مصفوفة بالأبعاد التالية [60,152].

يمكن لأي شخص أن يساعدني؟

شكرًا لك!

هل كانت مفيدة؟

المحلول

لا أعتقد أن هناك حاجة إلى وظيفة RowQuantile.ما عليك سوى اختيار أعلى القيم حتى عتبة الاحتمال:(تحرير الملاحظة (الإصدار الأول يحتوي على تعبير فهرس غير صحيح)

> apply( dat, 1, function(x) x[order(x)][1:( (1-0.95)*ncol(dat))])
    obs1     obs2     obs3 
 11.5379 856.3470 136.8860 

وكما هو الحال دائمًا، نظرًا لأن مصفوفات R موجهة نحو الأعمدة، فمن المحتمل أنك تريد استخدامها t() على النتيجة لإعادة هذا إلى اتجاه الصف الذي تتوقعه.

إلى تعليقك:تم إصلاحه بحيث يلتقط أعلى القيم بدلاً من القيم الأدنى:

 apply( dat, 1, function(x)
                  x[order(x, decreasing=TRUE)][1:( (1-0.95)*ncol(dat))])

نصائح أخرى

0.05 * 3036 = 151.8 لكن اختيار قيم أكبر من 95% في كل صف لا يعني أنه سيكون لديك 152 قيمة بشكل منهجي.إذا كنت تريد الاحتفاظ بأبعاد كائنك، يمكنك محاولة استبدال القيم غير المرغوب فيها بها NA'س.
نظرًا لأن الكائن الخاص بك ليس ضخمًا، يمكنك أيضًا العمل مع كائنات إطار البيانات والحصول على ملاحظاتك على طول بُعد الصف.

library(matrixStats)

# To extract your values...
myfun <- function(k, q){x[k, x[k,] > q]}
x <- matrix(sample(1:100, 60*3036, replace=TRUE), ncol=3036)
xx <- mapply(myfun, seq(along=x[,1]), rowQuantiles(x, probs=.95))
# xx is a list, xx[[1]] contains the values of x[1,] > quantile(x[1, ], .95)

# The number of selected values depends on their distribution - with NORM should be stable
x11() ; par(mfrow=c(2,1))
hist(sample(1:100, 60*3036, replace=TRUE)) # UNIF DISTRIB
n.val <- sapply(xx, length)
hist(n.val, xlab="n.val > q_95%")
abline(v=152, col="red", lwd=5)

# Assuming you want the same number of value for each row
n <- min(n.val)
myfun <- function(x){sample(x, n)} # Representative sample - Ordering is possible but introduce bias. Depends on your goals
xx <- t(sapply(xx, myfun))
dim(xx) # 60 n
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top