2017-03-07 31 views
0

我一直在對我的問題的解決方案進行一些研究,我認爲它在某種地方適用。我需要把我的數據框分割成船名,每當活動發生變化時將0.1添加到net#中,然後合併數據集。我的數據框看起來像這樣。使用daply拆分應用組合

Boat Net # Activity 
Ray F 40  Lift 
Dawn  67  Lift 
Ray F 40  Set 
Dawn  67  Set 
Ray F 40  Lift 
Ray F 40  Set 
Ray F 40  Lift 
Dawn  67  Lift 

在我應用函數後,我需要框架看起來像這樣。每次Activity = Set時,基本上每次向網絡添加0.1,但是船隻彼此獨立。

Boat Net # Activity 
Ray F 40.0  Lift 
Dawn  67.0  Lift 
Ray F 40.1  Set 
Dawn  67.1  Set 
Ray F 40.1  Lift 
Ray F 40.2  Set 
Ray F 40.2  Lift 
Dawn  67.1  Lift 

我一直在使用該功能增加0.1淨#在活動的每一個變化,它已經真的很好,但沒有考慮到船的名字。

df$`Net #` <- df$`Net #` + seq(0, 1, by = 0.1)[with(df, cumsum(c(TRUE, Activity[-1]!= Activity[-length(Activity)])))] + 1 

最初我嘗試使用拆分,然後應用函數,但沒有做任何事,所以我切換到daply。我試過這個,並得到以下錯誤:

daply(df, df$Boat, .fun = df$`Net #` + seq(0, 1, by = 0.1)[with(df, cumsum(c(TRUE, Activity[-1]!= Activity[-length(Activity)])))] + 1) 

Error in parse(text = x) : <text>:1:6: unexpected symbol 
1: Dawn Marie 
    ^

我想我是在正確的道路上,但任何幫助將是偉大的。

+0

這是一個可怕的專欄名稱。爲什麼不救自己的麻煩,只是把它'網絡'。 –

回答

0

使用dplyr包和%>%操作:

df <- df %>% group_by(Boat) %>% mutate(Net = Net + cumsum(Activity == "Set") * 0.1) %>% ungroup 

,我們找到了答案:

Boat Net Activity 
1 Ray F 40.0  Lift 
2 Dawn 67.0  Lift 
3 Ray F 40.1  Set 
4 Dawn 67.1  Set 
5 Ray F 40.1  Lift 
6 Ray F 40.2  Set 
7 Ray F 40.2  Lift 
8 Dawn 67.1  Lift 

相同的代碼,但沒有%>%如果你喜歡:

df <- ungroup(mutate(group_by(df, Boat), Net = Net + cumsum(Activity == "Set") * 0.1)) 
+0

工程就像一個魅力!感謝您的幫助。 –