2009-12-11 4 views
1

J'ai le vecteur de caractères ci-dessousvaleur inattendue pour la longueur d'un vecteur dans R

a = c("2009-07-31 18:00:33", "2009-07-31 18:00:38", "2009-07-31 18:00:43", "2009-07-31 18:00:49", "2009-08-01 01:58:49", "2009-08-01 01:53:16", "2009-08-01 08:04:13", "2009-08-01 16:16:13") 

Je veux convertir des objets ce en temps donc je faire:

b = strptime(a, "%Y-%m-%d %H:%M:%S") 

Pourquoi a et b avoir des longueurs différentes?

> length(a) 
[1] 8 
> length(b) 
[1] 9 

Répondre

1

L'objet b a la classe POSIXlt. Les tableaux de POSIXlt dates renvoient toujours une longueur de 9, depuis la représenter une liste nommée de neuf vecteurs:

R> class(b) 
[1] "POSIXt" "POSIXlt" 

R> unclass(b) 
$sec 
[1] 33 38 43 49 49 16 13 13 
$min 
[1] 0 0 0 0 58 53 4 16 
$hour 
[1] 18 18 18 18 1 1 8 16 
$mday 
[1] 31 31 31 31 1 1 1 1 
$mon 
[1] 6 6 6 6 7 7 7 7 
$year 
[1] 109 109 109 109 109 109 109 109 
$wday 
[1] 5 5 5 5 6 6 6 6 
$yday 
[1] 211 211 211 211 212 212 212 212 
$isdst 
[1] 1 1 1 1 1 1 1 1 

classe POSIXct, qui représente le (signé) le nombre de secondes depuis le début de 1970 en tant que numérique vecteur, vous donne la longueur attendue:

R> length(as.POSIXct(a)) 
[1] 8 
R> unclass(as.POSIXct(a)) 
[1] 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 
[8] 1.249e+09 
attr(,"tzone") 
[1] "" 
+0

Je l'ai maintenant. Un vecteur n'est pas un contenant comme je le pensais. Les heures sont-elles stockées dans b des objets? Pouvez-vous avoir une référence à un objet POSIXlt? – hekevintran

+0

Je voulais dire qu'une liste n'est pas un contenant comme je le pensais. – hekevintran

0

Comme vous pouvez le voir dans ?strptime il convertit les chaînes de caractères à la classe POSIXlt. Dans R il y a deux types de temps: POSIXlt et POSIXct. La description est en ?DateTimeClasses, mais raccourci:

classe « POSIXct » représente le (signé) le nombre de secondes depuis le début de 1970 en tant que vecteur numérique.

classe "POSIXlt" est un nom liste des vecteurs représentant sec 0-61: secondes min 0-59: minutes heures 0-23: heures mday 1-31: jour du mois mon 0-11 : mois après le premier de l'année. année Années depuis 1900. jour 0-6 jour de la semaine, à partir de le dimanche. jour 0-365: jour de l'année . isdst Heure d'été flag. Positif si en vigueur, zéro si pas, négatif si inconnu.

Votre b est donc une liste de 9 vecteurs de 8 longueurs chacun.

Vous pouvez voir:

sapply(b,length) 

Vous pouvez utiliser la conversion exacte:

b_1 = as.POSIXlt(a, "%Y-%m-%d %H:%M:%S",tz="") 
b_2 = as.POSIXct(a, "%Y-%m-%d %H:%M:%S",tz="") 

length(b_1) # 9 
length(b_2) # 8 
0

Pour la petite histoire, cette question de la FAQ est sur le point de changer en R 2.11.0:

2.11.0 NOUVELLES CARACTÉRISTIQUES

longueur (POSIXlt) maintenant re tourne la longueur du résumé correspondant timedate-vector plutôt que toujours 9 (la longueur de la structure sous-jacente liste ). (Souhait de PR # 14073 et PR # 10507.)

C'est de l'entrée 2 Décembre du flux RSS résumant les changements quotidiens dans l'archive Subversion, le developer page pour plus de détails sur l'alimentation.

Questions connexes