R - 从系列中排除数字

时间:2017-06-02 21:14:27

标签: r

好的,我有一系列数字。我希望排除小于-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的第一个实例,直到系列结束(不管以下数字的值)

此图像显示此项,正确的输出为绿色。

enter image description here

*修改

解决方案: 处理超过-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()

1 个答案:

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