2017-06-02 64 views
2

好吧,我有一系列数字。我期待排除小于-0.10的值。但是,如果在-0.10之后出现一个超过-0.10的数字,它将被忽略。R - 从系列中排除数字

我至今试图通过rleid使用dplyr为任务分组,然后试图想出一个办法在我的第一个系列的数字使用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() 
+0

如果重新发布的照片​​中,我们可以在编辑就为将来的用户 –

+0

我认为这个问题是你的'artprice'是一个字符。它应该工作,如果你这样做:'newdf $ artprice < - as.numeric(gsub(“\\ $”,“”,newdf $ artprice))'并重新运行。 –

+0

好吧,因为我喜欢学习...为什么我们包括\\ $“,”“?这是为了排除任何这些缺失的行,值等? –

回答

1

一种选择是使用嵌套的if语句。对于通常在输出中标记为1的每种情况,我们可以检查紧接在它之前的行中的x值是否为< -0.1。如果是,则我们的标签的输出作为0这种情况下,而不是1

该发现可以在dplyr包中的R中找到行先前值滞后功能:

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 

编辑:

处理多个的情况下,你可以ü SE这一点:

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 
+0

哇!天才 - 非常好的主意,我甚至不知道嵌套的if语句,这是非常有用的!!谢谢你给我看:) –

+0

哦,是的,我刚刚意识到,那么我们有多个连续值> -.010的情况呢?让我编辑另一个场景 –

+0

@AndrewBannerman - 谢谢,不客气。我只是更新了代码来处理您的额外条件。 – www