重新组织,重新分组并减少R中的冗余

时间:2018-07-13 20:54:28

标签: r time-series data-manipulation tapply

我有如下数据:

Hours<-c(.25,.5,.5,.5,.25,.5, 1, .5)
WaterYear<-rep(2013:2014,each = 4); WaterYear
Events0<-c(1,0,2,2,2,0,3,3)
Events1<-c(0,0,0,1,0,0,2,0)
Events2<-c(0,0,0,0,0,0,1,0)
df<-data.frame(WaterYear, Hours,Events0,Events1, Events2);df

我想针对三个建模方案(事件0,事件1,事件2)中的每一个,按事件组总结小时数。

到目前为止,我已经使用tapply创建单个表:

df2<-tapply(df$Hours, list(df$Events0, df$WaterYear), sum)
df2<-df2[-c(1), ]

这为我提供了场景Events0的正确值,但是,我想要一个表,看起来像下面的表,所有信息汇总在一起。

Event   Hours   Year    Level
1       0.25    2013    Events0
2       1.00    2013    Events0
3       0.25    2014    Events0
4       1.50    2014    Events0
1       0.50    2013    Events1
2       1.00    2014    Events1
1       0.50    2013    Events2
2       1.00    2014    Events2

我也有很多事件,所以我想要一些不需要太多重复的代码。

任何帮助将不胜感激。另外,如果您对使用更好的搜索词有建议,以便我可以找到该问题的答案(如果已回答),也将不胜感激。

1 个答案:

答案 0 :(得分:0)

可以尝试使用tidyr::gather转换长格式的数据。然后在LevelEventWaterYear上分组以汇总Hours的数据:

library(tidyverse)

df %>% gather(Level, Event, - "Hours",   -"WaterYear") %>%
  filter(Event != 0) %>%
  group_by(Level, Event, WaterYear) %>%
  summarise(Hours = sum(Hours)) %>%
  as.data.frame() %>%
  select(Event,   Hours,   WaterYear,    Level)

#   Event Hours WaterYear   Level
# 1     1  0.25      2013 Events0
# 2     2  1.00      2013 Events0
# 3     2  0.25      2014 Events0
# 4     3  1.50      2014 Events0
# 5     1  0.50      2013 Events1
# 6     2  1.00      2014 Events1
# 7     1  1.00      2014 Events2