2017-08-02 116 views
1

我有三個變量。有三個唯一的ID,每個都有多個記錄。在R中重複N次數據

ID <- c(rep(1,2), rep(2,1), rep(3,2)) 
y0 <- c(rep(5,2), rep(3,1), rep(1,2)) 
z0 <- c(rep(1,2), rep(13,1), rep(4,2)) 

dat1 <- data.frame(ID, y0,z0) 

我所想的就是重複整個數據N次(N需要一個參數),我需要與重複號碼中添加新列。

所以,如果N = 2,新的數據是這樣的:

rep <- c(rep(1,2), rep(2,2), rep(1,1), rep(2,1), rep(1,2), rep(2,2)) 
ID <- c(rep(1,4), rep(2,2), rep(3,4)) 
y0 <- c(rep(5,4), rep(3,2), rep(1,4)) 
z0 <- c(rep(1,4), rep(13,2), rep(4,4)) 

dat2 <- data.frame(rep, ID, y0,z0) 
+2

嘗試'DAT1 $代表< - 與(DAT1,AVE(ID,ID,FUN = seq_along)); dat1 [rep(seq_len(nrow(dat1)),each = 2),]' – akrun

+0

ID = 2時失敗。 – user9292

+0

ID 2的第二次重複的rep列必須具有2的值,但此處爲1. – user9292

回答

1

我們複製行的順序和order後來得到預期的輸出

res <- cbind(rep = rep(seq_len(2), each = nrow(dat1)), dat1[rep(seq_len(nrow(dat1)), 2),]) 
resN <- res[order(res$ID),] 
row.names(resN) <- NULL 
all.equal(dat2, resN, check.attributes = FALSE) 
#[1] TRUE 

或者其他選項是將replicate轉換爲list,然後用Map創建'rep'列(不建議將函數名稱作爲列名稱,對象名稱等)和rbindlist元件

res1 <- do.call(rbind, Map(cbind, rep = seq_len(2), replicate(2, dat1, simplify = FALSE))) 
res2 <- res1[order(res1$ID),] 
row.names(res2) <- NULL 
all.equal(dat2, res2, check.attributes = FALSE) 
#[1] TRUE 
+0

@ user9292我想這應該現在工作 – akrun

+0

它現在的作品。謝謝! – user9292