7
votes

Obtenir des positions pour NAS uniquement dans le "milieu" d'une colonne matricielle

Je veux obtenir un index qui fait référence aux positions des valeurs NA dans une matrice où l'indice est vrai si une cellule donnée est na et une valeur non NA antérieure à la colonne. Par exemple, étant donné la matrice suivante xxx

la seule valeur de l'index qui revient vrai devrait être [2,2].

y a-t-il une expression compacte pour quoi Je veux faire? Si je devais faire boucler des colonnes et utiliser quelque chose comme min (qui (! Is.na (x [ i]))) Pour trouver la première valeur non NA dans chaque colonne et Puis définissez toutes les valeurs avant cela sur FALSE (et le même pour toutes les valeurs après le maximum). De cette façon, je ne choisirais pas les valeurs NA en tête et à la fin. Mais cela semble un peu désordonné, alors je me demande s'il y a une expression plus propre qui fait cela sans boucles.

EDIT Pour être valide une valeur NA doit avoir un Valeur non na avant et après quelque part dans la colonne, mais pas nécessairement adjacente à celle-ci. Par exemple, si une colonne a été définie par C (NA, 3, Na, NA, NA, 4, NA), les NA que je souhaite trouver, ce serait ceux des positions 3, 4 et 5, car ils sont enfermés par valeurs non NA.

r

3 commentaires

[2,3] ne devrait pas être retourné aussi?


Daroczig - Non, car il n'y a pas de valeur non NA avant et après elle dans la colonne.


Merci, j'aurais dû lire votre question plus pensivement. J'ai essayé de créer une réponse vectorisée en fonction de vos coordonnées, j'espère que cela pourrait fonctionner pour votre.


3 Réponses :


6
votes

Je n'ai pas testé cela très soigneusement, mais cela fonctionne sur le cas de test:

z <- matrix(c(NA,1,NA,1,NA,2,NA,NA,NA,1,2,3),ncol=4)
isNA <- is.na(z)
# Vertical index which increments at non-NA entries, counting top-to-bottom:
nonNA_idx.tb <- apply(!isNA, 2, cumsum)
# Vertical index which increments at non-NA entries, counting bottom-to-top:
nonNA_idx.bt <- apply(!isNA, 2, function(x) { rev(cumsum(rev(x))) })
which(isNA & nonNA_idx.tb>0 & nonNA_idx.bt>0, arr.ind=TRUE)


2 commentaires

Vous devez expliquer l'intelligence. X1 est une séquence d'indexation qui incrémente les entrées non NA, comptant le haut à bas. x2 est la même, comptant en arrière (bas en haut). Ils ne sont que les deux non nuls des entrées internes enfermées par des non-NAS sur le haut et le bas, donc leurs indices non NA comptant dans les deux directions sont> 0. Enfin, la porte avec A & pour filtrer uniquement les NAS internes. Pouvez-vous renommer x1, x2 être plus intuitif? nonna_idx.tb, nonna_idx.bt Peut-être?


@smci, si vous avez la réputation nécessaire (et on dirait que vous le faites - 2K), n'hésitez pas à éditer ...



1
votes
m <- matrix(c(1, NA, NA, 5, 1, NA, 3, 5, 4, NA, NA, NA, 1, 2, 3, 5), ncol= 4)

3 commentaires

Votre réponse et votre mine sont complémentaires, je pense (interprétations différentes de la question)


En fait, la lecture plus proche, je pense que je suis trompé, car ma version revient plus de [2, 2]. Changer le | dans la dernière ligne sur & et il renvoie uniquement [2, 2], mais je pense qu'il recherche un compte de NA cumulatif. Cependant, une question utile parce que je n'ai jamais saisi comment se référer aux lignes et colonnes à proximité sans utiliser de boucle.


Désolé pour la confusion, j'avais voulu dire un Na pour lequel il y a une valeur non Na quelque part avant ou après elle dans la colonne, mais pas nécessairement adjacente à celle-ci. Par exemple, si vous aviez une matrice de matrice d'entrée (C (NA, 1, Na, NA, NA, NA, NA, NA, NA, NA, 1,2,3,4), NCOL = 4), Vous ne voudriez que retourner [2,2] et [2,3]. Néanmoins, votre code offre certainement une approche intéressante du problème connexe de traiter avec NAS pour laquelle il doit exister une valeur non-NA adjacente.



2
votes
pts <- sample(c(1:10,NA), size = 100, replace = T)

mat <- matrix(pts, ncol = 10)

which(is.na(mat), arr.ind = T)

0 commentaires