2017-12-18 213 views
-1

我需要基于一个过滤器操作我需要应用该组如何计算基于R中的过滤器

DF

id dg cs 
1 s 1 
1 v 0 
2 s 0 
2 v 1 
2 s 1 
2 s 0 
3 s 1 
3 s 1 
3 v 1 

一组数的记录数的记录数我需要在“dg”中的“v”之前统计(或标记)'dg-cs'字段中出现's-1'组合的记录数。

因此,出认沽将

id dg cs output 
1 s 1 True 
1 v 0 False 
2 s 0 False 
2 v 1 False 
2 s 1 False 
2 s 0 False 
3 s 1 True 
3 s 1 True 
3 v 1 False 
+0

您描述的行为与“id”列无关吗?或者你想要在每个“id”中的行为?另外,在你的例子中,所有's-1'组合都会得到一个“真”值。你能发表一个更具代表性的例子吗? (即,'s-1'的情况是'False')。 – AntoniosK

+0

@AntoniosK不,它的依赖...行为是应用于每个组的特定ID – hbabbar

回答

6

我的做法是以下几点:

library(dplyr) 

df %>% 
    group_by(id) %>% 
    mutate(out = dg == "s" & cs == 1 & cumsum(dg == "v") == 0) 

## A tibble: 9 x 4 
## Groups: id [3] 
#  id dg cs out 
# <int> <chr> <int> <lgl> 
#1  1  s  1 TRUE 
#2  1  v  0 FALSE 
#3  2  s  0 FALSE 
#4  2  v  1 FALSE 
#5  2  s  1 FALSE 
#6  2  s  0 FALSE 
#7  3  s  1 TRUE 
#8  3  s  1 TRUE 
#9  3  v  1 FALSE 

的部分cumsum(dg == "v") == 0意味着如果dg=="v"还没有出现针对特定ID只能是真实的。

+0

我以某种方式获取所有False作为输出,我检查过dg和cs字段确实是chr和int类型。我也尝试使用paranthesis,mutate(out =(dg =='s'&cs == 1&(cumsum(dg =='v')== 0))) – hbabbar

+0

@hbabbar然后您的样本数据错误或描述 –

+0

r3 <- df%>% group_by(id)%>% mutate(out =(cumsum(dg ==“v”)== 0)) 使用此代码时,我发现仍然没有Trues,难道是cumsum()不能按预期工作。 (我的ID字段是数字类型) – hbabbar