2017-08-31 2 views
0

Dans R,Dans R, subsetting négatif produit des résultats inattendus avec un nombre légèrement plus grand

print((1:20)[-(15:18)])

imprime la liste des nombres entiers de 1 à 20 à l'exception de 15 à 18, comme prévu.

Mais

print((1983:2010)[-(1992:1994)])

imprime la liste des nombres entiers 1983-2010, dont 1992 à 1994. Le négatif subsetting ne fonctionne pas.

Que se passe-t-il ici? Je sais que R peut avoir des problèmes avec des nombres extrêmement grands, mais je ne considérerais pas ces nombres extrêmement grands.

Répondre

0

Ceci est basé sur l'index numérique. Dans le deuxième exemple, nous n'avons pas un vecteur de longueur> 1994, mais dans le premier cas, il y a

length(1983:2010) 
#[1] 28 

La façon de traiter cette option pour utiliser %in%

v1 <- 1983:2010 
v1[!v1 %in% 1992:1994] 

Ou utilisez l'indice sur la base de la longueur initiale des vector

v1[-((length(v1)-2):length(v1))] 
+0

Merci. Je ne veux pas avoir à compter les postes qu'ils occuperaient. Y a-t-il un moyen de le faire en une ligne? Ou devez-vous nommer la liste en premier, puis sous-ensemble? – lost

+0

@lost Les deux solutions que j'ai postées sont une ligne. Je ne sais pas ce que vous vouliez dire par "one-liner". Si 'v1 <- 1983: 2010' est considéré comme une autre ligne, c'est juste pour créer l'objet – akrun

+0

Je suppose que je voulais dire un doublure comme dans une déclaration? Je ne sais pas si c'est la bonne nomenclature. Ce que je pensais était ce que neilfws a donné dans son commentaire – lost

0

les valeurs entre crochets se réfèrent à la position du nombre dans le vecteur, et non le nombre lui-même.

Dans votre premier exemple, les numéros 15-18 occupent également les positions 15-18.

Dans votre deuxième exemple, les numéros 1992-1994 n'occupent pas les postes 1992-1994. Ils occupent les positions 10-12. Donc, vous pouvez utiliser:

print((1983:2010)[-(10:12)]) 
+0

J'ai compris. Y a-t-il une solution facile sans avoir à compter les indices? – lost

+0

Vous pourriez faire 'print ((1983: 2010) [! 1983: 2010% in% 1992: 1994])'. – neilfws

+0

Parfait merci! – lost