2011-08-03 3 views
1

J'ai des informations date/heure où je veux obtenir la moyenne, min, max, gamme des dates à travers "saisons" regroupées par années et la seule façon J'ai été légèrement réussi de faire ceci est avec tapply. La plus proche est la fonction de résumé dans tapply. Les résultats sont ce que je suppose est une liste par année de la min, max, 1er Qu, médiane etc. Ce ne sont pas exactement ce dont j'ai besoin, mais fonctionne bien.r combiner les résultats de tapply en utilisant do.call (rbind) ou ddply

Exemple de résultats que je reçois de la fonction tapply de 1 saison:

$`2003` 
        Min.     1st Qu.     Median      Mean     3rd Qu.      Max. 
"2003-04-22 00:00:00 UTC" "2003-05-03 00:00:00 UTC" "2003-05-12 00:00:00 UTC" "2003-05-10 02:00:00 UTC" "2003-05-18 00:00:00 UTC" "2003-05-21 00:00:00 UTC" 

$`2004` 
        Min.     1st Qu.     Median      Mean     3rd Qu.      Max. 
"2004-04-07 00:00:00 UTC" "2004-04-13 00:00:00 UTC" "2004-05-10 00:00:00 UTC" "2004-05-01 07:08:56 UTC" "2004-05-11 12:00:00 UTC" "2004-05-20 00:00:00 UTC" 

Ce que je veux faire est de combiner ces listes I générons pour les différentes saisons dans un grand heureux dataframe que je peux exporter dans un fichier CSV . J'ai cherché et cherché et devient encore plus confus. La plupart des gens suggèrent que le plus simple est

test = do.call(rbind, sSM, eSM, sC) #note here sSM, eSM, sC are my "seasons" 

Cependant, cela me donne un message d'erreur ou une trame "test" vide. J'ai lu au sujet du paquetage de plyr et ai supposé que ddply au lieu du tapply pour forcer le résultat dans un dataframe devrait fonctionner, mais je ne peux pas comprendre comment faire fonctionner cela même parce que je ne peux pas l'obtenir à faire les fonctions dont je aurais besoin, comme la moyenne, min, max, & gamme ...

le résultat final, je voudrais quelque chose comme:

Season Year Min   Max  Mean  Median 
sSM  2003 2003-04-21 2003-5-1 2003-4-25 2003-4-23 
eSM  2003... 
sSM  2004... 
eSM  2004... 

alors je voudrais faire la même chose exacte , seulement déterminer au sein de l'individu à travers les années. J'ai un champ ID dans lequel, depuis quelques années, le même individu a été mesuré. Je voudrais obtenir une date de début moyenne pour cette personne à travers les années au sein de chaque saison. Laissant de côté les personnes qui n'ont pas été mesurées sur plusieurs années.

Comme je ne comprends pas comment manipuler les listes et les tableaux et même ce que fait tapply je ne sais pas comment réparer tout cela. Est-ce que je crée un dataframe vide et y mets tout ce truc dans une boucle ou quelque chose? Voici quelques exemples de données provenant de 4 «saisons» sur une période de quelques années. Certaines dates ont la date et l'heure et d'autres ont juste la date.

structure(list(Year = c(2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
2003L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2005L, 2005L, 
2005L, 2005L, 2005L, 2005L, 2006L, 2006L, 2006L, 2006L), ID = structure(c(11L, 
12L, 13L, 14L, 15L, 16L, 17L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 14L, 15L, 1L, 2L, 3L, 6L), .Label = c("c_002", "c_102", 
"c_104", "c_105", "c_109", "c_401", "c_9814", "c_9815", "c_9816", 
"c_9819", "c_9901", "c_9902", "c_9905", "c_9908", "c_9911", "c_9912", 
"c_9916"), class = "factor"), sSM = structure(c(10L, 10L, 9L, 
17L, 8L, 8L, 7L, 18L, NA, 1L, NA, 15L, 13L, 12L, 6L, 3L, 5L, 
2L, 4L, 16L, 14L, 11L, 11L), .Label = c("04/07/2004 15:00", "04/23/2005 10:01", 
"04/25/2005 03:01", "04/27/2005 02:00", "04/27/2005 08:00", "04/29/2005 04:00", 
"05/01/2003", "05/03/2003", "05/04/2003", "05/05/2003", "05/05/2006", 
"05/07/2005 16:01", "05/11/2004 11:00", "05/11/2006", "05/13/2004 08:00", 
"05/14/2006", "05/17/2003", "05/17/2004 12:02"), class = "factor"), 
    eSM = structure(c(13L, 18L, 15L, 21L, 16L, 10L, 14L, 20L, 
    NA, 1L, NA, 11L, 7L, 5L, 6L, 17L, 3L, 2L, 4L, 19L, 9L, 12L, 
    8L), .Label = c("04/27/2004 05:00", "05/01/2005 05:00", "05/06/2005 05:00", 
    "05/08/2005 07:01", "05/12/2005 21:00", "05/15/2005 19:00", 
    "05/18/2004 13:00", "05/18/2006", "05/20/2006", "05/21/2003", 
    "05/21/2004 01:01", "05/23/2006", "05/24/2003", "05/25/2003", 
    "05/26/2003", "05/27/2003", "05/27/2005 01:00", "05/28/2003", 
    "05/28/2006", "06/01/2004 02:01", "06/03/2003"), class = "factor"), 
    sC = structure(c(9L, 12L, 16L, 19L, 18L, 12L, 7L, 13L, NA, 
    10L, NA, 20L, 4L, 14L, 11L, 5L, 1L, 2L, 3L, 8L, 17L, 6L, 
    15L), .Label = c("05/26/2005 00:00", "05/26/2005 10:00", 
    "05/27/2005 06:01", "05/28/2004 08:00", "05/29/2005 23:01", 
    "05/29/2006", "05/30/2003", "05/30/2006", "05/31/2003", "05/31/2004 06:01", 
    "05/31/2005 15:00", "06/01/2003", "06/01/2004 07:02", "06/01/2005 16:00", 
    "06/01/2006", "06/03/2003", "06/03/2006", "06/04/2003", "06/05/2003", 
    "06/05/2004 01:00"), class = "factor"), eC = structure(c(11L, 
    2L, 15L, 6L, 17L, 17L, 2L, 8L, NA, 7L, NA, 13L, 5L, 9L, 9L, 
    3L, 10L, 1L, 4L, 12L, 14L, 16L, 12L), .Label = c("06/03/2005 18:00", 
    "06/04/2003", "06/04/2005 04:01", "06/05/2005 05:01", "06/06/2004 22:00", 
    "06/07/2003", "06/07/2004 23:00", "06/08/2004 19:01", "06/08/2005 03:00", 
    "06/10/2005 20:00", "06/12/2003", "06/13/2006", "06/14/2004 00:00", 
    "06/14/2006", "06/16/2003", "06/18/2006", "06/19/2003"), class = "factor")), .Names = c("Year", 
"ID", "sSM", "eSM", "sC", "eC"), class = "data.frame", row.names = c(NA, 
-23L)) 

Voici un code Ive écrit jusqu'à présent:

dates$StartSM = as.POSIXct(strptime(dates$sSM,"%m/%d/%Y",tz="UTC"),tz="UTC")     
dates$EndSM = as.POSIXct(strptime(dates$eSM,"%m/%d/%Y",tz="UTC"),tz="UTC") 
dates$EndC = as.POSIXct(strptime(dates$eC,"%m/%d/%Y %H:%M",tz="UTC"),tz="UTC") 
dates$StartC = as.POSIXct(strptime(dates$sC,"%m/%d/%Y %H:%M",tz="UTC"),tz="UTC") 
sSpringM = tapply(dates$StartSM, dates$Year, summary) 
eSpringM = tapply(dates$EndSM, dates$Year, summary) 
sCalving = as.vector(tapply(dates$StartC, dates$Year, summary)) 
eCalving = tapply(dates$EndC, dates$Year, summary) 
datadates = do.call(rbind, sSpringM, eSpringM, sCalving) 
+1

Pouvez-vous remplacer la version lisible par l'homme de vos données par la sortie de 'dput (youDataGoesHere)'? Il sera beaucoup plus facile de s'assurer que la solution développée fonctionne pour vous puisque les types de données et autres correspondront exactement. – Chase

+0

@Chase, désolé - j'ai commencé à le faire, mais alors ne devine pas ... il est toujours préférable de l'ajouter. Je pensais juste que la question devenait trop longue.Je veux juste que les gens sachent que j'ai essayé de trouver quelque chose et de faire une tentative. – Kerry

+0

Pas de soucis - Je trouve 'dput()' particulièrement utile lorsque les formats date/heure sont impliqués ... les différences semblent être source de beaucoup de confusion. Je suis toujours confus quant à la façon dont vous définissez le printemps et l'été? Est-ce que les colonnes 'sSM',' eSM', 'eC',' sC' ont une valeur quelconque après les avoir converties aux formats d'heure appropriés? – Chase

Répondre

0

Vous avez (en haut de toute façon) une liste, appelez-le "yourlist". Essayez ceci pour les imprimer:

lapply(yourlist, format, "%Y-%m-%d") 

Si vous voulez dans une matrice:

do.call(rbind, sapply(yourlist, unlist)) 

Je ne vois pas de « hiver », « printemps », etc dans votre structure. Dans le passé, j'ai utilisé les fonctions année, trimestre, mois et semaine du package data.table pour renvoyer un vecteur de valeurs numériques pour les années, trimestres, mois et semaines. Il est facile de tracer avec les années entières plus les ajouts fractionnaires appropriés comme année (.) + Trimestre/4. Plus facile que les problèmes de coupe et d'étiquetage correspondants qui en résulteraient autrement.

+0

Je m'excuse, je ne devrais pas avoir des termes mélangés. sSM est une saison pour mes propres disques. techniquement, c'est le début de la migration printanière, eSM est la fin de la migration printanière sC est le début du vêlage etc. Ce que je veux compiler, c'est mes différentes «saisons» indépendamment de ce qu'on appelle - quand est la date moyenne, min et max ? Puis par individu au cours des années, quand est leur date moyenne particulière au sein de cette saison particulière. – Kerry

Questions connexes