2017-12-18 147 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