2017-08-04 46 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不。我的代碼將日期複製爲「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,因爲我們不想改變第一個塊。

這將返回

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,這個可以寫

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

作爲替代計數過程中,我們可以用rep一起使用​​這樣

# 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 

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