复制一行但有一些修改

时间:2014-03-30 16:28:26

标签: r

我有一个像这样的大数据集:

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应该所有等于0SMOKEMDV保持不变。预期的输出应如下所示:

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
...

有没有人知道要实现这个目标?

2 个答案:

答案 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

答案 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