2014-03-30 36 views
1

我有一个大的数据集是这样的:复制行,但有一些修改

SUB SMOKE AMT MDV ADDL II EVID 
1 0 0 0 0 0 0 
1 0 20 0 16 24 1 
1 0 0 0 0 0 0 
1 0 0 0 0 0 0 
2 1 0 0 0 0 0 
2 1 50 0 24 12 1 
2 1 0 0 0 0 0 
2 1 0 0 0 0 0 
... 

我要复制的行那里EVID=1和下方插入,但对于复制行,AMTADDLIIEVID应该都等于0,SMOKEMDV保持不变。预期的输出应该是这样的:

SUB SMOKE AMT MDV ADDL II EVID 
1 0 0 0 0 0 0 
1 0 20 0 16 24 1 
1 0 0 0 0 0 0 
1 0 0 0 0 0 0 
1 0 0 0 0 0 0 
2 1 0 0 0 0 0 
2 1 50 0 24 12 1 
2 1 0 0 0 0 0 
2 1 0 0 0 0 0 
2 1 0 0 0 0 0 
... 

有没有人有关于实现这一点的想法?

回答

3
# repeat EVID=0 rows 1 time and EVID=1 rows 2 times 
r <- rep(1:nrow(DF), DF$EVID + 1) 
DF2 <- DF[r, ] 

# insert zeros 
DF2[duplicated(r), c("AMT", "ADDL", "II", "EVID")] <- 0 

捐赠:

> DF2 
    SUB SMOKE AMT MDV ADDL II EVID 
1  1  0 0 0 0 0 0 
2  1  0 20 0 16 24 1 
2.1 1  0 0 0 0 0 0 
3  1  0 0 0 0 0 0 
4  1  0 0 0 0 0 0 
5  2  1 0 0 0 0 0 
6  2  1 50 0 24 12 1 
6.1 2  1 0 0 0 0 0 
7  2  1 0 0 0 0 0 
8  2  1 0 0 0 0 0 
+0

尼斯把戏'代表(1:nrow(DF),DF $ EVID + 1)' –

0

也许这:

> t2 <- t[t$EVID==1,] # t is your data.frame 
> t2[c("AMT","ADDL","II","EVID")] <- 0 
> t2 
    SUB SMOKE AMT MDV ADDL II EVID 
2 1  0 0 0 0 0 0 
6 2  1 0 0 0 0 0 
> rbind(t,t2) 
    SUB SMOKE AMT MDV ADDL II EVID 
1 1  0 0 0 0 0 0 
2 1  0 20 0 16 24 1 
3 1  0 0 0 0 0 0 
4 1  0 0 0 0 0 0 
5 2  1 0 0 0 0 0 
6 2  1 50 0 24 12 1 
7 2  1 0 0 0 0 0 
8 2  1 0 0 0 0 0 
21 1  0 0 0 0 0 0 # this row 
61 2  1 0 0 0 0 0 # and this one are new 
相关问题