好的,我有一系列数字。我希望排除小于-0.10的值。但是,如果在第一个-0.10之后出现超过-0.10的数字,则忽略它。
我到目前为止尝试使用dplyr
进行rleid
的任务分组,然后尝试在我的第一个数字序列中找到使用row_number()
的方法,我可以将first
值的位置标记为-0.10以下。一旦我知道row_number,就可以忽略第一个实例的任何其他值after
并从输出中排除。
我正在使用这个虚拟数据:
x <- c(0,0,-0.07347,-0.08351,-0.09091,-0.10624,-0.08087,-0.10677,-0.14588,-0.13901,-0.13689,0,0,0,-0.09091,0.10624,0.08087,0.10677,0,0)
y <- c(0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0)
df <- data.frame (x,y)
# Remove leading 1 on x column
df$z <- ifelse(df$x <0 | df$x >0, 1,0)
# Exclude values (all less than -0.1)
df$output <- ifelse(df$z == 1 & df$x > -0.1 ,1,0)
所需的输出是df$z == 1
时和<-0.10
... print 0
的第一个实例,直到系列结束(不管以下数字的值)
此图像显示此项,正确的输出为绿色。
*修改
解决方案: 处理超过-0.010的多次运行
df %>%
group_by(rleid=rleid(z)) %>%
mutate(outcome=as.numeric(!row_number() > row_number(z==1 & x < -0.1))) %>%
mutate(outcome=replace(outcome,z == 1 & x < -0.1, 0)) %>%
mutate(outcome=replace(outcome,z == 0, 0)) %>%
ungroup() %>% select(-rleid) %>% data.frame()
答案 0 :(得分:1)
一种选择是使用嵌套的if语句。对于通常在输出中标记为1的每种情况,我们可以检查它之前的行中的x值是否为&lt; -0.1。如果是,那么我们将输出标记为0,而不是1。
找到行先前值的滞后函数可以在R中的 dplyr 包中找到:
require(dplyr)
df %>%
mutate(output=ifelse(z==1 & x > -0.1,ifelse(lag(x) < -0.1,0,1),0))
输出:
x y z output
1 0.00000 0 0 0
2 0.00000 1 0 0
3 -0.07347 1 1 1
4 -0.08351 1 1 1
5 -0.09091 1 1 1
6 -0.10624 1 1 0
7 -0.08087 1 1 0
8 -0.10677 1 1 0
9 -0.14588 1 1 0
10 -0.13901 1 1 0
11 -0.13689 1 1 0
12 0.00000 0 0 0
13 0.00000 0 0 0
14 0.00000 1 0 0
15 -0.09091 1 1 1
16 0.10624 1 1 1
17 0.08087 1 1 1
18 0.10677 1 1 1
19 0.00000 0 0 0
20 0.00000 0 0 0
修改强>
对于处理多个案例,您可以使用:
df %>%
group_by(rleid=rleid(z)) %>%
mutate(outcome=as.numeric(!row_number() > row_number(z==1 & x < -0.1))) %>%
mutate(outcome=replace(outcome,z == 1 & x < -0.1, 0)) %>%
mutate(outcome=replace(outcome,z == 0, 0)) %>%
ungroup() %>% select(-rleid) %>% data.frame()
输出:
x y z outcome
1 0.00000 0 0 0
2 0.00000 1 0 0
3 -0.07347 1 1 1
4 -0.08351 1 1 1
5 -0.09091 1 1 1
6 -0.10624 1 1 0
7 -0.08087 1 1 0
8 -0.05677 1 1 0
9 -0.03588 1 1 0
10 -0.02901 1 1 0
11 -0.01689 1 1 0
12 0.00000 0 0 0
13 0.00000 0 0 0
14 0.00000 1 0 0
15 -0.09091 1 1 1
16 0.10624 1 1 1
17 0.08087 1 1 1
18 0.10677 1 1 1
19 0.00000 0 0 0
20 0.00000 0 0 0