2017-02-20 84 views
0

我不確定標題是否足夠精確以描述我的問題。我有一組數據框1:n兩組AB和可能的狀態Calm,Action1Action2R爲多個條件設置的值創建一個新列

triggers <- c("Action1", "Action2") 
    df <- data.frame(Set = c(rep(1, 4), rep(2, 4), rep(1, 4)),                    
        Group = c(rep("A", 4), rep("A", 4), rep("B", 4)),                  
        Status = c(rep("Calm",3), "Action1", rep("Calm",3), 
           "Action2", rep("Calm", 4))) 
Set Group Status 
1 A Calm 
1 A Calm 
1 A Calm 
1 A Action1 
2 A Calm 
2 A Calm 
2 A Calm 
2 A Action2 
1 B Calm 
1 B Calm 
1 B Calm 
1 B Calm 

基於矢量triggers我想創建在滿足以下條件的新列。

如果在一組(每個組)的Action1Action2發生比寫入到一個新的列中的狀態Action也爲StatusCalm

新列中的結果應爲c(rep("Action", 8), rep("Calm", 4))

我無法解決這個數據框中多重條件的問題。希望有人能幫助我,並原諒我對這個問題的非數學描述。

回答

1

這應該工作:

df %>% dplyr::group_by(Group, Set) %>% 
    do(mutate(. ,result = ifelse(any(Status %in% triggers), "Action", "Calm"))) 

Source: local data frame [12 x 4] 
Groups: var2, var1 [3] 
    Set Group Status result 
    <dbl> <chr> <chr> <chr> 
1  1  A Calm Action 
2  1  A Calm Action 
3  1  A Calm Action 
4  1  A Action1 Action 
5  2  A Calm Action 
6  2  A Calm Action 
7  2  A Calm Action 
8  2  A Action2 Action 
9  1  B Calm Calm 
10  1  B Calm Calm 
11  1  B Calm Calm 
12  1  B Calm Calm 
+0

Awesome-是否也能提供一個data.table解決方案? – Christian

+0

Ahaha,聰明地使用'any':D – Aramis7d

+0

@Christian我不是'data.table'專家。我的'data.table'解決方案不會很好。但是如果你不使用大數據集'dplyr'應該做得很好。 – Alex

0

考慮dft爲您inut數據框,你可以使用dplyr和嘗試:

dft %>% 
    group_by(Group, Set) %>% 
    mutate(nc = if_else(Status %in% triggers, 1, 0)) %>% 
    mutate(nc = max(nc)) %>% 
    mutate(nc2 = if_else(nc == 1, "Action", as.character(Status))) %>% 
    select(nc2) 

附:第二個和第三個mutate命令可以合併爲一個。

1

這裏是一個data.table解決方案的要求

library(data.table) 
dt1 <- setDT(df) 
dt1[, result := ifelse(sum(Status %in% triggers) == 0, "Calm", "Action"), by = .(Group, Set)] 

隨着數據集提供這大約是6.5倍的速度使用dplyr

+0

數據集中有2個分組變量。 – Alex

+0

@Alex謝謝,修復它 – manotheshark