سؤال

كيف يمكنني جمع عدد الحالات الكاملة لعمودين؟

مع c يساوي:

      a  b
[1,] NA NA
[2,]  1  1
[3,]  1  1
[4,] NA  1

تطبيق شيء من هذا القبيل

rollapply(c, 2, function(x) sum(complete.cases(x)),fill=NA)

اريد استرجاع رقم واحد 2 في هذه الحالة.سيكون هذا لمجموعة بيانات كبيرة تحتوي على العديد من الأعمدة، لذلك أرغب في استخدامها rollapply عبر المجموعة بأكملها بدلاً من مجرد القيام بذلك sum(complete.cases(a,b)).

هل أنا أكثر من التفكير في ذلك؟

شكرًا!

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

المحلول

يمكنك حساب عدد الحالات الكاملة في أعمدة المصفوفة المجاورة باستخدام rollapply مثله:

m <- matrix(c(NA,1,1,NA,1,1,1,1),ncol=4)
#     [,1] [,2] [,3] [,4]
#[1,]   NA    1    1    1
#[2,]    1   NA    1    1

library(zoo)

rowSums(rollapply(is.na(t(m)), 2, function(x) !any(x)))
#[1] 0 1 2

نصائح أخرى

هل جربت sum(complete.cases(x))?!

set.seed(123)
x <- matrix( sample( c(NA,1:5) , 15 , TRUE ) , 5 )
#     [,1] [,2] [,3]
#[1,]    1   NA    5
#[2,]    4    3    2
#[3,]    2    5    4
#[4,]    5    3    3
#[5,]    5    2   NA


sum(complete.cases(x))
#[1] 3

لتجد ال complete.cases() من العمودين الأولين:

sum(complete.cases(x[,1:2]))
#[1] 4

و ل apply إلى عمودين من أ matrix عبر المصفوفة بأكملها يمكنك القيام بذلك:

#  Bigger data for example
set.seed(123)
x <- matrix( sample( c(NA,1:5) , 50 , TRUE ) , 5 )
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]    1   NA    5    5    5    4    5    2   NA    NA
#[2,]    4    3    2    1    4    3    5    4    2     1
#[3,]    2    5    4   NA    3    3    4    1    2     2
#[4,]    5    3    3    1    5    1    4    1    2     1
#[5,]    5    2   NA    5    3   NA   NA    1   NA     5

# Column indices
id <- seq( 1 , ncol(x) , by = 2 )
[1] 1 3 5 7 9
apply( cbind(id,id+1) , 1 , function(i) sum(complete.cases(x[,c(i)])) )
[1] 4 3 4 4 3

complete.cases() يعمل بشكل صفي عبر الكل data.frame أو matrix عودة TRUE لتلك الصفوف التي لا تفتقد أي بيانات.جانبا طفيفة، "c" هو اسم متغير سيئ لأن c() هي واحدة من الوظائف الأكثر استخداما.

يجب أن يعمل هذا لكليهما matrix و data.frame

> sum(apply(c, 1, function(x)all(!is.na(x))))

[1] 2

ويمكنك ببساطة التكرار من خلال مصفوفة كبيرة M

for (i in 1:(ncol(M)-1) ){
    c <- M[,c(i,i+1]
    agreement <- sum(apply(c, 1, function(x)all(!is.na(x))))
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top