如何根据某些条件删除行

时间:2016-05-27 23:10:50

标签: r

我的数据如下:

row  ID  YU  DV
 1    1   0   .
 2    1   .   .
 3    1   .   .
 4    1   .   .
 5    1   45  .
 6    1   .   7
 7    1   .   .
 8    1   .   .
 9    1   .   .
 10   1   65  .
 11   1   .   5
 12   1   .   .
 13   1   .   .
 14   1   .   .
 15   2   20  .
 16   2   .   .
 17   2   .   5
 18   2   .   .
 19   2   .   .
 20   2   0   .
 21   2   .   .
 22   2   .   .
 23   2   .   .
 24   2   43  .
 25   2   .   3
 26   2   .   .
 27   2   .   .
 28   2   .   .

因此,每当YU列中的值变为0时,我希望行变为零以及所有​​后续行,直到YU中的值变为非零,由包含值1的变量DF识别,如果不是零。我希望它看起来像这样:

row  ID  YU  DV  DF
 1    1   0   .  1
 2    1   .   .  1
 3    1   .   .  1
 4    1   .   .  1
 5    1   45  .  0
 6    1   .   7  0
 7    1   .   .  0
 8    1   .   .  0
 9    1   .   .  0
 10   1   65  .  0
 11   1   .   5  0
 12   1   .   .  0
 13   1   .   .  0
 14   1   .   .  0
 15   2   20  .  0
 16   2   .   .  0
 17   2   .   5  0
 18   2   .   .  0
 19   2   .   .  0
 20   2   0   .  1
 21   2   .   .  1
 22   2   .   .  1
 23   2   .   .  1
 24   2   43  .  0
 25   2   .   3  0
 26   2   .   .  0
 27   2   .   .  0
 28   2   .   .  0

2 个答案:

答案 0 :(得分:2)

以下是data.tablezoo

的另一个选项
library(data.table)
library(zoo)
setDT(df1)[, DF := na.locf(+(!as.numeric(YU)))]
df1
#    row ID YU DV DF
# 1:   1  1  0  .  1
# 2:   2  1  .  .  1
# 3:   3  1  .  .  1
# 4:   4  1  .  .  1
# 5:   5  1 45  .  0
# 6:   6  1  .  7  0
# 7:   7  1  .  .  0
# 8:   8  1  .  .  0
# 9:   9  1  .  .  0
#10:  10  1 65  .  0
#11:  11  1  .  5  0
#12:  12  1  .  .  0
#13:  13  1  .  .  0
#14:  14  1  .  .  0
#15:  15  2 20  .  0
#16:  16  2  .  .  0
#17:  17  2  .  5  0
#18:  18  2  .  .  0
#19:  19  2  .  .  0
#20:  20  2  0  .  1
#21:  21  2  .  .  1
322:  22  2  .  .  1
323:  23  2  .  .  1
#24:  24  2 43  .  0
#25:  25  2  .  3  0
#26:  26  2  .  .  0
#27:  27  2  .  .  0
#28:  28  2  .  .  0

或其他选项是

with(df1, na.locf(c(NA, 0, 1)[(YU!=".") + (YU=="0")+1]))
#[1] 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0

答案 1 :(得分:1)

使用dplyrtidyr的解决方案:

library(dplyr); library(tidyr);
df %>% mutate(DF = as.integer(as.numeric(as.character(YU)) == 0)) %>% fill(DF)

   row ID YU DV DF
1    1  1  0  .  1
2    2  1  .  .  1
3    3  1  .  .  1
4    4  1  .  .  1
5    5  1 45  .  0
6    6  1  .  7  0
7    7  1  .  .  0
8    8  1  .  .  0
9    9  1  .  .  0
10  10  1 65  .  0
11  11  1  .  5  0
12  12  1  .  .  0
13  13  1  .  .  0
14  14  1  .  .  0
15  15  2 20  .  0
16  16  2  .  .  0
17  17  2  .  5  0
18  18  2  .  .  0
19  19  2  .  .  0
20  20  2  0  .  1
21  21  2  .  .  1
22  22  2  .  .  1
23  23  2  .  .  1
24  24  2 43  .  0
25  25  2  .  3  0
26  26  2  .  .  0
27  27  2  .  .  0
28  28  2  .  .  0