使用daply来分割应用组合

时间:2017-03-07 22:55:48

标签: r

我一直在研究我的问题的解决方案,我认为它在某个地方很大。我需要把我的数据框拆分为船名,每次活动改变时加0.1到net#然后合并数据集。我的数据框看起来像这样。

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 

应用函数后,我需要框架看起来像这样。每次活动=设置时,基本上都会在网上添加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到net#,并且它工作得非常好,但没有考虑船名。

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

最初我尝试使用Split,然后应用该功能,但没有做任何事情,所以我切换到了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
     ^

我认为我走的是正确的道路,但任何帮助都会很棒。

1 个答案:

答案 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))