2017-08-04 8 views
0

最後に日付の異なる列のデータフレームを繰り返すにはどうすればよいですか? previously recommendedのいずれかの方法を適用すると、すべての列が繰り返されます。たとえば、次のように私は必要なもののに対し日付の列が異なるデータフレームを繰り返す

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 

は次のとおりです。

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

あなたのデータセットでは、 '-07-31'はどのように '07-01'に変更されましたか – akrun

+0

@akrun No.私のコードは日付を" 2011-07-31 "と複製しています。私が必要とするのは、各反復においてそれを変えることです。もう一つの問題は私のタイプミスです。今すぐ修正します。 – Eva

答えて

0

ここではあなたの例のために働く別の基地Rの方法があります。

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

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

ロジックは、x1が初期値(ここでは1)に戻るたびに増分される累積合計を使用することです。我々は、最初のブロックを変更したくないので、結果から1を引く。

これは

transformを使用し
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(dat, x3 = x3 + cumsum(x1 == 1) - 1) 

を書き込むことができ、我々はこの

# update x3 variable 
dat$x3 <- dat$x3 + rep(seq_len(n)-1L, each=nrow(df)) 
よう repと一緒​​を使用することができます3210
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 

または

> library(dplyr) 
> df1 <- df[rep(1:nrow(df), n),] 
> df1 %>% group_by(x1,x2) %>% mutate(x3= x3 + 1:n() - 1L) 
関連する問題