R Sum de finaliser les dossiers de deux colonnes
Question
Comment puis-je calculer la somme du nombre de cas de deux colonnes?
Avec c
égale à:
a b
[1,] NA NA
[2,] 1 1
[3,] 1 1
[4,] NA 1
L'application de quelque chose comme
rollapply(c, 2, function(x) sum(complete.cases(x)),fill=NA)
Je voudrais revenir un numéro unique, 2
dans ce cas.Ce sera pour un grand ensemble de données avec de nombreuses colonnes, donc je voudrais l'utiliser rollapply
à travers l'ensemble au lieu de simplement faire sum(complete.cases(a,b))
.
Suis-je sur la pensée d'elle?
Merci!
La solution
Vous pouvez calculer le nombre de cas dans les pays voisins de la matrice de colonnes à l'aide de rollapply
comme ceci:
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
Autres conseils
Avez-vous essayé 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
Pour trouver l' complete.cases()
les deux premières colonnes:
sum(complete.cases(x[,1:2]))
#[1] 4
Et pour apply
à deux colonnes d'un matrix
sur l'ensemble de la matrice que vous pourriez faire ceci:
# 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()
travaux de la ligne sage dans l'ensemble de data.frame
ou matrix
de retour TRUE
pour ces lignes qui ne sont pas en manque des données.Un mineur de côté, "c"
est un mauvais nom de variable, car c()
est l'une des fonctions les plus couramment utilisées.
Cette shoudl de travail pour les deux matrix
et data.frame
> sum(apply(c, 1, function(x)all(!is.na(x))))
[1] 2
et vous pouvez simplement parcourir de grandes matrice 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))))
}