我有如下数据:
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
我也有很多事件,所以我想要一些不需要太多重复的代码。
任何帮助将不胜感激。另外,如果您对使用更好的搜索词有建议,以便我可以找到该问题的答案(如果已回答),也将不胜感激。
答案 0 :(得分:0)
可以尝试使用tidyr::gather
转换长格式的数据。然后在Level
,Event
和WaterYear
上分组以汇总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