2016-07-12 11 views
0

Ich bin neu in R und finde es schwierig, eine Reihe von Zeilen zu generieren, wobei jede generierte Zeile ein berechnetes Datum hat.Liste der Daten basierend auf einem Datum in r generieren

Zum Beispiel aus einem Datensatz wie folgt gehen:

Name date_birth 
Greg 01/02/2015 
Fred 02/02/2015 

... die folgenden zu erzeugen:

Name date_birth age date_atage<br/> 
Greg 01/02/2015 0  01/02/2015 
Greg 01/02/2015 1  02/02/2015 
Greg 01/02/2015 2  03/02/2015 
Fred 02/02/2015 0  02/02/2015 
Fred 02/02/2015 1  03/02/2015 
Fred 02/02/2015 2  04/02/2015 

Ich habe Seiten wie R-Blogger, allgemeine Lehr Blogs studieren und Diese Site und ich haben versucht, eine Schleifenanweisung herauszufinden, die die Seq-Anweisung beinhaltet, so dass für jedes Individuum (zB Greg, Fred, etc.) der Prozess wiederholt werden kann, wo Daten berechnet und in ihre eigenen Zeilen platziert werden. Ihr erster Gedanke könnte sein, dass dies in Excel einfacher ist, aber es ist nicht so, da ich dies für über 800 Personen (d. H. Nicht nur Greg und Fred) und für bis zu 300 Tage alt wiederholen muss.

+0

Wo Sie bekommen Alter ab, oder ist es nur um eins erhöhen? – MikeRSpencer

+0

Ja, es wird einfach um 1 Tag erhöht. Aber ich möchte, dass die generierte Liste von 1 Tag alt bis 300 Tage alt wird. Also generiere grundsätzlich 300 neue Zeilen für jedes Individuum. – ElTenero

Antwort

3

Wir data.table

library(data.table) 
setDT(df1)[, .(date_birth, date_at_age = format(seq(as.Date(date_birth, 
     "%d/%m/%Y"), length.out=3, by = "1 day"), "%d/%m/%Y")) , 
      by = Name][,age := seq_len(.N)-1 , by = Name][] 
# Name date_birth date_at_age age 
#1: Greg 01/02/2015 01/02/2015 0 
#2: Greg 01/02/2015 02/02/2015 1 
#3: Greg 01/02/2015 03/02/2015 2 
#4: Fred 02/02/2015 02/02/2015 0 
#5: Fred 02/02/2015 03/02/2015 1 
#6: Fred 02/02/2015 04/02/2015 2 
+0

Ich hatte Erfolg mit dem oben genannten. Ich habe auch versucht, das Alter der Schwangerschaft (und damit verbundene Daten) zu berechnen. Vorausgesetzt, die Schwangerschaft beginnt 290 Tage vor der Geburt, Schwangerschaftsalter (Tage) = 290 + (Datum in der Schwangerschaft - Geburtsdatum). Ich habe den folgenden Code verwendet, um das Schwangerschaftsalter zu berechnen, aber die resultierenden Werte sind negativ. Gibt es eine Möglichkeit, sie positiv zu machen? Bibliothek (data.table) setDT (df) [,. (Date_birth, date_at_pregage = Format (seq (as.Date (date_birth, "% d /% m /% Y"), length.out = 291, von = "-1 Tag"), "% d /% m /% Y")), von = Name] [, preg_age: = seq_len (.N) -291, von = Name] [] – ElTenero

+1

über Problem gelöst , Ich habe abs (df2 $ preg_age) – ElTenero

0

verwenden Dies ist eine lange Form Weg, um die gleiche Stelle zu bekommen, die Sie nehmen data.table.

Sehen Sie sich an, wie Sie Daten in R verwenden. Ich habe Ihr Originalformat verwendet und es in ein Datum konvertiert (Codezeile 2). Weitere Codes finden Sie unter http://strftime.org/.

einige Dummy-Daten Set:

df = data.frame(name=c("Gregg", "Joan"), DOB=c("01/02/2015", "02/02/2015"), stringsAsFactors=F) 

Fabrikat Datumsformat:

df$DOB = as.Date(df$DOB, format="%d/%m/%Y") 

Schleife über jeden Namen, so dass 301 Fälle und das Hinzufügen von Tag

df = lapply(1:nrow(df), function(i){ 
    x = data.frame(name=rep(df[i, 1], times=301), 
        DoB=rep(df[i, 2], times=301), 
        age=0:300) 
    x$newDate = x$DoB + x$age 
    x 
}) 

Convert Liste DOB zu ein Datenrahmen:

df = do.call("rbind.data.frame", df) 

prüfen Ausgabe:

head(df) 
0

Setup-

df <- cbind(c("Greg","Fred"),c("01/02/2015","02/02/2015")) 
max_age <- 2 
start_at <- 0 

Script

new_df <- data.frame(rep(NA,(max_age+1)*dim(df)[1])) 
new_df[,1] <- rep(df[,1],each=max_age-start_at+1) #Names 
new_df[,2] <- rep(df[,2],each=max_age-start_at+1) #Birth date 
new_df[,3] <- rep(seq(from=start_at,to=max_age),dim(df)[1]) #Age 
library(lubridate) 
new_df[,4] <- dmy(new_df[,2]) + days(new_df[,3]) #Date at age 
colnames(new_df) <- c("names","date_birth","age","date_at_age") 
Verwandte Themen