2010-12-15 79 views
4

Supposons que j'ai un data.frame appelé SLV et que j'applique la fonction tail(). Je vais obtenir ceci:Quel est le meilleur moyen d'accéder à l'avant-dernière valeur dans un R data.frame?

> tail(SLV) 

     SLV.Open SLV.High SLV.Low SLV.Close SLV.Volume SLV.Adjusted 
2010-12-06 28.99 29.64 28.88  29.51 57561800  29.51 
2010-12-07 29.95 30.00 28.03  28.08 69143800  28.08 
2010-12-08 28.33 28.46 27.34  27.70 58203800  27.70 
2010-12-09 28.10 28.36 27.83  28.03 36759200  28.03 
2010-12-10 27.80 28.11 27.38  27.98 30602700  27.98 
2010-12-13 28.84 29.04 28.59  28.87 25901800  28.87 

par défaut queue() aux 6 dernières valeurs, mais il est facile d'obtenir juste la dernière valeur 1.

>tail(SLV, n=1) 

     SLV.Open SLV.High SLV.Low SLV.Close SLV.Volume SLV.Adjusted 
2010-12-13 28.84 29.04 28.59  28.87 25901800  28.87 

Mais quelle est la meilleure façon de retourner l'avant-dernier jour? Dans notre exemple SLV, ce serait la ligne datée 2010-12-10.

Répondre

14
head(tail(SLV, n=2), n=1) 

ou

SLV[nrow(SLV)-1,] 

fera.

+0

merci pour les deux – Milktrader

+1

Je pense que la deuxième solution est la bonne façon de faire la tâche. Le premier est trop compliqué, quand on regarde le code sous-jacent dans 'head' et' tail'. – Marek

+0

+1 pour la tête/queue, indépendamment de leur mise en œuvre - ils sont robustes dans mon expérience – mdsumner

3

tête (queue (SLV, n = 2), n = 1)

+0

bon de voir la même réponse postée simultanément. Merci. – Milktrader

4

Encore une autre alternative:

tail(SLV,2)[-2] 
+0

J'aime aussi celui-ci. – Milktrader

0

Très peu plus général que SLV [nrow (SLV) -1,]:

SLV[rev(1:nrow(SLV))[2],] 

littérales [2] peut être remplacé par un vecteur qui est peut-être plus propre si plus d'une rangée est nécessaire.

+1

A la place ou 'rev (1: nrow (SLV))' vous pouvez utiliser '(nrow (SLV): 1)'. – Marek