2017-06-22 3 views
1

Je dois identifier les sortants dans un jeu de données d'enquête. Pour cela, je voudrais ajouter une autre colonne à mes données qui compte les NA consécutifs, en commençant par une colonne spécifique, puis en comptant à rebours.Nombre de NA consécutives pour les colonnes dans data.frame dans l'ordre inverse

je l'ai déjà compté le NA global comme expliqué here, et bien qu'un nombre élevé de NA est un indicateur assez bon, je voudrais assurer que les gens ne sont pas simplement sauter à travers des parties du questionnaire au lieu de laisser purement et simplement.

est Voici quelques exemples de données:

df <- structure(list(f1 = c(3, 3, 1, 2, 3, 2, 2, NA, 2, 3), f2num = c(170, 
NA, 182, 173, 169, NA, NA, NA, 153, 178), f3num = c(105, NA, 
77, 80, 58, NA, NA, NA, 45, 81), f4num = c(2, NA, 0, NA, NA, 
NA, 1, NA, 0, 0), f5num = c(9, NA, 1, NA, NA, NA, 2, NA, 0, 2 
), f6num = c(NA, NA, NA, NA, NA, NA, 0, NA, NA, NA), f7 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), f7num = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), f8num = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), f9 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_)), .Names = c("f1", "f2num", "f3num", "f4num", 
"f5num", "f6num", "f7", "f7num", "f8num", "f9"), row.names = c(NA, 
10L), class = "data.frame") 

> df 
    f1 f2num f3num f4num f5num f6num f7 f7num f8num f9 
1 3 170 105  2  9 NA NA NA NA NA 
2 3 NA NA NA NA NA NA NA NA NA 
3 1 182 77  0  1 NA NA NA NA NA 
4 2 173 80 NA NA NA NA NA NA NA 
5 3 169 58 NA NA NA NA NA NA NA 
6 2 NA NA NA NA NA NA NA NA NA 
7 2 NA NA  1  2  0 NA NA NA NA 
8 NA NA NA NA NA NA NA NA NA NA 
9 2 153 45  0  0 NA NA NA NA NA 
10 3 178 81  0  2 NA NA NA NA NA 

Ma sortie attendue devrait ressembler à ceci:

> df 
    f1 f2num f3num f4num f5num f6num f7 f7num f8num f9 consNA 
1 3 170 105  2  9 NA NA NA NA NA  5 
2 3 NA NA NA NA NA NA NA NA NA  9 
3 1 182 77  0  1 NA NA NA NA NA  5 
4 2 173 80 NA NA NA NA NA NA NA  7 
5 3 169 58 NA NA NA NA NA NA NA  7 
6 2 NA NA NA NA NA NA NA NA NA  9 
7 2 NA NA  1  2  0 NA NA NA NA  4 
8 NA NA NA NA NA NA NA NA NA NA  10 
9 2 153 45  0  0 NA NA NA NA NA  5 
10 3 178 81  0  2 NA NA NA NA NA  5 

réponse de Jthorpe à this question m'a fait aussi loin que

t(apply(df,1,function(x)which.min(rev(is.na(x)))-1)) 

    1 2 3 4 5 6 7 8 9 10 
[1,] 5 9 5 7 7 9 4 0 5 5 

qui est évidemment presque ce dont j'ai besoin, mais ça ne marche pas si tout est NA (voir rangée 8).

+0

Et s'il y a deux ensembles de 'NA'? 'NA NA 2 3 4' NA NA' ou quelque chose comme ça. Lequel aimeriez-vous compter? –

+0

Je veux compter à partir d'un point auto-défini (une colonne dans l'ensemble de données) vers l'arrière jusqu'à la première occurrence de non-'NA'. Voir la ligne 7 dans les exemples de données. Dans le cas des données d'exemple, je commence à la dernière colonne et je reviens à l'ensemble de l'ensemble de données. – LAP

Répondre

2

C'est un peu maladroit, mais cela fonctionne:

df$consNA <- apply(df, 1, function(x) sum(cumsum(!is.na(rev(x))) == 0)) 

df$consNA 
#[1] 5 9 5 7 7 9 4 10 5 5 

Pour chaque ligne, on inverse l'ordre et de compter le premier ensemble de NA s jusqu'à ce qu'une non-NA est rencontré.