我的数据如下:
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
答案 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
答案 1 :(得分:1)
使用dplyr
和tidyr
的解决方案:
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