2017-08-04 5 views
0

Wie kann ich am Ende einen Datenrahmen mit unterschiedlicher Datumsspalte wiederholen? Wenn ich eine der previously recommended Möglichkeiten anwende, werden alle Spalten wiederholt. Zum Beispiel:Wiederhole Datenrahmen mit variierender Datumsspalte

df<-data.frame(x1=c(1:3), x2=c('z','g','h'), x3=c(rep(as.Date("2011-07-31"), by=1, len=3))) 
n=2 
do.call("rbind", replicate(n, df, simplify = FALSE)) 

    x1 x2  x3 
1 1 z 2011-07-31 
2 2 g 2011-07-31 
3 3 h 2011-07-31 
4 1 z 2011-07-31 
5 2 g 2011-07-31 
6 3 h 2011-07-31 

Während, was ich brauche ist:

x1 x2   x3 
1 1 z 2011-07-31 
2 2 g 2011-07-31 
3 3 h 2011-07-31 
4 1 z 2011-08-01 
5 2 g 2011-08-01 
6 3 h 2011-08-01 
+0

In Ihrem Dataset ist es "-07-31", wie es in '07-01' geändert wurde. – akrun

+0

@akrun Nein. Mein Code repliziert das Datum als" 2011-07-31 ". Was ich dagegen brauche ist, dass ich mich in jeder Iteration ändere. Das andere Problem ist mein Tippfehler. Wird es jetzt reparieren. – Eva

Antwort

0

Hier ist eine weitere Basis R-Methode, die für Ihr Beispiel funktioniert.

# save result 
dat <- do.call("rbind", replicate(n, df, simplify = FALSE)) 

# update x3 variable 
dat$x3 <- dat$x3 + cumsum(dat$x1 == 1) - 1 

Die Logik ist, dass wir eine kumulative Summe nutzen, der alle Zeit x1 kehrt zu seinem Anfangswert (hier 1) erhöht wird. Wir ziehen 1 vom Ergebnis ab, da wir den ersten Block nicht ändern wollen.

diese zurück

dat 
    x1 x2   x3 
1 1 z 2011-07-31 
2 2 g 2011-07-31 
3 3 h 2011-07-31 
4 1 z 2011-08-01 
5 2 g 2011-08-01 
6 3 h 2011-08-01 

transform verwenden, können diese

transform(dat, x3 = x3 + cumsum(x1 == 1) - 1) 

Als Alternative Zählverfahren geschrieben werden, könnten wir seq_len zusammen verwenden mit rep wie diese

# update x3 variable 
dat$x3 <- dat$x3 + rep(seq_len(n)-1L, each=nrow(df)) 
2
> n=2 
> df1 <- df[rep(1:nrow(df), n),] 
> transform(df1, x3=ave(x3, x1, FUN=function(x) x + 1:length(x) - 1L)) 
    x1 x2   x3 
1 1 z 2011-07-31 
2 2 g 2011-07-31 
3 3 h 2011-07-31 
1.1 1 z 2011-08-01 
2.1 2 g 2011-08-01 
3.1 3 h 2011-08-01 

oder

> library(dplyr) 
> df1 <- df[rep(1:nrow(df), n),] 
> df1 %>% group_by(x1,x2) %>% mutate(x3= x3 + 1:n() - 1L) 
Verwandte Themen