复制第二个主题ID的数据帧

时间:2014-09-19 00:24:55

标签: r dataframe

我有以下数据框:

ID  TIME AMT A1 A2  DV
 1  0   100 100 0   NA
 1  1   0   NA  NA  NA
 1  2   0   NA  NA  NA
 1  3   0   NA  NA  NA
 1  4   100 NA  NA  NA
 1  5   0   NA  NA  NA
 1  6   0   NA  NA  NA
 1  6   0   NA  NA  NA
 1  7   0   NA  NA  NA

R中是否有办法可以复制它,但将ID更改为ID = 2。结果应如下所示:

ID  TIME AMT A1 A2  DV
 1  0   100 100 0   NA
 1  1   0   NA  NA  NA
 1  2   0   NA  NA  NA
 1  3   0   NA  NA  NA
 1  4   100 NA  NA  NA
 1  5   0   NA  NA  NA
 1  6   0   NA  NA  NA
 1  6   0   NA  NA  NA
 1  7   0   NA  NA  NA
 2  0   100 100 0   NA
 2  1   0   NA  NA  NA
 2  2   0   NA  NA  NA
 2  3   0   NA  NA  NA
 2  4   100 NA  NA  NA
 2  5   0   NA  NA  NA
 2  6   0   NA  NA  NA
 2  6   0   NA  NA  NA
 2  7   0   NA  NA  NA

提前谢谢!

3 个答案:

答案 0 :(得分:2)

索引+ transform

transform(dat[rep(rownames(dat),2),], ID = rep(1:2,each=nrow(dat) ))

或作为一项功能:

rep.and.count <- function(x,n) {
  transform(x[rep(rownames(x),n),], ID = rep(seq_len(n),each=nrow(x) ))
}
rep.and.count(dat,2)

即使数据非常小,它的速度也要快得多。

ids <- 1:15000
system.time({do.call(rbind, lapply(ids, function(id) {
  new.dat <- dat
  new.dat$ID <- id
  return(new.dat)
}))})

#   user  system elapsed 
#   8.61    0.03    8.78

system.time(rep.and.count(dat,15000))

#   user  system elapsed 
#   0.13    0.00    0.13 

答案 1 :(得分:0)

您可以使用split-apply-combine构建包含每个所需ID的新数据框,然后使用rbind组合它们:

ids <- c(1, 2)
do.call(rbind, lapply(ids, function(id) {
  new.dat <- dat
  new.dat$ID <- id
  return(new.dat)
}))
#    ID TIME AMT  A1 A2 DV
# 1   1    0 100 100  0 NA
# 2   1    1   0  NA NA NA
# 3   1    2   0  NA NA NA
# 4   1    3   0  NA NA NA
# 5   1    4 100  NA NA NA
# 6   1    5   0  NA NA NA
# 7   1    6   0  NA NA NA
# 8   1    6   0  NA NA NA
# 9   1    7   0  NA NA NA
# 10  2    0 100 100  0 NA
# 11  2    1   0  NA NA NA
# 12  2    2   0  NA NA NA
# 13  2    3   0  NA NA NA
# 14  2    4 100  NA NA NA
# 15  2    5   0  NA NA NA
# 16  2    6   0  NA NA NA
# 17  2    6   0  NA NA NA
# 18  2    7   0  NA NA NA

答案 2 :(得分:0)

尝试:

dfout = ddf
for(i in 2:5) {ddf[,1]=i; dfout = rbind(dfout, ddf)}
dfout
   ID TIME AMT  A1 A2 DV
1   1    0 100 100  0 NA
2   1    1   0  NA NA NA
3   1    2   0  NA NA NA
4   1    3   0  NA NA NA
5   1    4 100  NA NA NA
6   1    5   0  NA NA NA
7   1    6   0  NA NA NA
8   1    6   0  NA NA NA
9   1    7   0  NA NA NA
10  2    0 100 100  0 NA
11  2    1   0  NA NA NA
12  2    2   0  NA NA NA
13  2    3   0  NA NA NA
14  2    4 100  NA NA NA
15  2    5   0  NA NA NA
16  2    6   0  NA NA NA
17  2    6   0  NA NA NA
18  2    7   0  NA NA NA
19  3    0 100 100  0 NA
20  3    1   0  NA NA NA
21  3    2   0  NA NA NA
22  3    3   0  NA NA NA
23  3    4 100  NA NA NA
24  3    5   0  NA NA NA
25  3    6   0  NA NA NA
26  3    6   0  NA NA NA
27  3    7   0  NA NA NA
28  4    0 100 100  0 NA
29  4    1   0  NA NA NA
30  4    2   0  NA NA NA
31  4    3   0  NA NA NA
32  4    4 100  NA NA NA
33  4    5   0  NA NA NA
34  4    6   0  NA NA NA
35  4    6   0  NA NA NA
36  4    7   0  NA NA NA
37  5    0 100 100  0 NA
38  5    1   0  NA NA NA
39  5    2   0  NA NA NA
40  5    3   0  NA NA NA
41  5    4 100  NA NA NA
42  5    5   0  NA NA NA
43  5    6   0  NA NA NA
44  5    6   0  NA NA NA
45  5    7   0  NA NA NA