web-dev-qa-db-fra.com

La sous-sélection de la trame de données R donne de mystérieuses lignes NA

J'ai rencontré ce que je pense est un bug. Ce n'est pas grave, mais je suis curieux de savoir si quelqu'un d'autre a déjà vu cela. Malheureusement, mes données sont confidentielles, je dois donc créer un exemple, et cela ne sera pas très utile.

Lors de la sous-définition de mes données, j'obtiens parfois des lignes NA mystérieuses qui ne figurent pas dans mon bloc de données d'origine. Même les noms de domaine sont NA. PAR EXEMPLE:

example <- data.frame("var1"=c("A", "B", "A"), "var2"=c("X", "Y", "Z"))
example

  var1 var2
1    A    X
2    B    Y
3    A    Z

alors je cours:

example[example$var1=="A",]

  var1 var2
1    A    X
3    A    Z
NA<NA> <NA>

Bien sûr, l'exemple ci-dessus ne vous donne pas réellement cette mystérieuse rangée de NA; Je l'ajoute ici pour illustrer le problème que j'ai avec mes données.

Peut-être est-ce dû au fait que j'importe mon jeu de données d'origine à l'aide de le paquet read.xlsx de Google , puis que je m'exécute ensuite en largeur avant de refondre.

Merci

45
chrisg

Emballez la condition dans which:

df[which(df$number1 < df$number2), ]

Comment ça marche:

Il renvoie les numéros de ligne auxquels la condition correspond (où la condition est TRUE) et sous-définit le cadre de données sur ces lignes en conséquence.

Dites ça:

which(df$number1 < df$number2)

renvoie les numéros de ligne 1, 2, 3, 4 et 5.

En tant que tel, écrit:

df[which(df$number1 < df$number2), ]

est identique à l'écriture:

df[c(1, 2, 3, 4, 5), ]

Ou une version encore plus simple est:

df[1:5, ]
35
c-urchin

Je vois que le PO a déjà répondu à cela, mais comme son commentaire est enfoui profondément dans la section commentaire, voici ma tentative pour résoudre ce problème (du moins avec mes données, qui se comportaient de la même manière).

Tout d’abord, quelques exemples de données:

> df <- data.frame(name = LETTERS[1:10], number1 = 1:10, number2 = c(10:3, NA, NA))
> df
   name number1 number2
1     A       1      10
2     B       2       9
3     C       3       8
4     D       4       7
5     E       5       6
6     F       6       5
7     G       7       4
8     H       8       3
9     I       9      NA
10    J      10      NA

Passons maintenant à un filtre simple:

> df[df$number1 < df$number2, ]
     name number1 number2
1       A       1      10
2       B       2       9
3       C       3       8
4       D       4       7
5       E       5       6
NA   <NA>      NA      NA
NA.1 <NA>      NA      NA

Le problème ici est que la présence de NAs dans la troisième colonne force R à réécrire toute la ligne en tant que NA. Néanmoins, les dimensions du bloc de données sont conservées. Voici mon correctif, qui nécessite de savoir quelle colonne contient le NAs:

> df[df$number1 < df$number2 & !is.na(df$number2), ]
  name number1 number2
1    A       1      10
2    B       2       9
3    C       3       8
4    D       4       7
5    E       5       6
22
Waldir Leoncio

Je rencontre le même problème lorsque j'utilise un code similaire à celui que vous avez posté. Utiliser la fonction subset () 

subset(example,example$var1=="A")

la ligne NA est plutôt exclue.

11
user3612472

Utiliser dplyr:

library(dplyr)
filter(df, number1 < number2)
3
Victor Yan
   > example <- data.frame("var1"=c("A", NA, "A"), "var2"=c("X", "Y", "Z"))
    > example
      var1 var2
    1    A    X
    2 <NA>    Y
    3    A    Z
    > example[example$var1=="A",]
       var1 var2
    1     A    X
    NA <NA> <NA>
    3     A    Z

Probablement cela doit être votre résultat escompté ... Essayez ceci Essayez d'utiliser quelle condition avant condition pour éviter les NA

  example[which(example$var1=="A"),]
      var1 var2
    1    A    X
    3    A    Z
1

Une autre cause peut être que la condition est incorrecte, par exemple en vérifiant si une colonne de facteur est égale à une valeur qui ne figure pas parmi ses niveaux. M'a troublé pendant un moment.

0
Jan Šimbera