2017-03-07 30 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

工程就像一个魅力!感谢您的帮助。 –