web-dev-qa-db-fra.com

Syntaxe R pour sélectionner toutes les lignes sauf deux

Comment puis-je sélectionner tout sauf les deux premières lignes de par exemple l'ensemble de données mtcars?

Je sais que je peux écrire no_mazda <- mtcars[3:32], Ce qui fonctionne tant que je connais le nombre de lignes. Mais quand je ne connais pas le nombre de lignes que je dois écrire, par ex. no_mazda <- mtcars[3:nrow(mtcars)] quelle cause fonctionne également, mais:

Est-ce que R fournit une syntaxe plus intelligente qu'une expression qui inclut mtcars deux fois?

23
Christian Madsen

Je préfère utiliser tail avec des valeurs négatives pour n:

tail(mtcars,-2)
22
Joshua Ulrich

Les indices négatifs signifient "sauter":

mtcars[-(1:2)]

ignore les 2 premiers indices de vecteurmtcars. Si vous devez sauter les 10 premiers, utilisez simplement mtcars[-(1:10)].

Notez que vous parlez de "dataset" mais que le code que vous utilisez est pour les vecteurs, j'ai donc également répondu si mtcars est un vecteur. Si mtcars est une trame de données et que vous sélectionnez des lignes, vous devez utiliser une virgule de fin:

mtcars[-(1:2),]
33
TMS

S'il vous arrive d'utiliser un data.table (et pourquoi est-ce que quelqu'un ne l'utiliserait pas, si vous utilisez un data.frame de toute façon?) - alors vous pouvez utiliser le .N ( plus d'informations ), qui contient essentiellement le nombre de lignes de votre table.

Voici un exemple de travail:

# make sure you have data.table
install.packages("data.table")
library(data.table)

# load the mtcars data
data(mtcars)
# Make a data table out of the mtcars dataset
cars <- as.data.table(mtcars, keep.rownames = TRUE)

# Take all the rows from a given index (e.g. 5) to the end
> cars[5:.N]
                     rn  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
 1:   Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
 2:             Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
 3:          Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
 4:           Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2 

... (truncated)

Échangez simplement ce 5 contre un 2 afin d'obtenir la sortie souhaitée de l'OP.

Ceci permet bien sûr une utilisation dynamique pour des tables de longueurs variables, sans avoir à toujours utiliser la fonction length(). Par exemple, si vous savez que vous voulez toujours prendre les 5 dernières lignes d'un tableau et supprimer la toute dernière ligne - obtenir 4 lignes en sortie - alors vous pouvez faire quelque chose comme ceci:

> cars[(.N-4):(.N-1)]    # note the expressions for slicing must be in parentheses
           rn  mpg cyl  disp  hp drat    wt qsec vs am gear carb
1:   Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
2: Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
3:   Ferrari Dino 19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
4:  Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8

Ou obtenez toujours la dernière ligne:

cars[.N]

... qui est tout aussi agréable et concis que l'équivalent de Python: cars[-1])

2
n1k31t4