2016-05-27 111 views
1

我的數據是這樣的:如何刪除基於某些條件的行

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

所以,每當餘列中的值變爲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 
+0

您使用哪種編程語言,並且可以共享您嘗試過的任何代碼? – PseudoAj

+0

@pseudoAJ 8我正在使用r。我正在嘗試這樣的事情:for(i in unique(data $ ID)){data $ DF < - ifelse(data $ YU [data $ ID == i == 0,1,0)}。但是,我無法獲得語法來指定YU = 0之後的行,直到YU變爲> 0爲止。 –

+0

你真的有'''或者他們是'NA'嗎? 'x < - dd $ YU; x [x =='。'] < - NA; +(動物園:: na.locf(x)=='0')' – rawr

回答

1

使用dplyrtidyr A液:

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 
2

這裏是data.table另一種選擇和zoo

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