使用df
data.frame
set.seed(123)
date <- as.Date(seq(as.Date("2003-01-01"), as.Date("2008-05-31"), by = 1), format="%Y-%m-%d")
flow <- runif(1978, 48530, 1250365)
df <- data.frame(date, flow)
和EcoHydRology
包,我使用baseflow
函数将bf
flow
与BaseflowSeparation
分开。
library(EcoHydRology)
df$bf <- BaseflowSeparation(df$flow, filter_parameter = 0.925, passes = 3)
该函数会创建两个新列bf.bt
和bf.qft
我想使用flow
在一个图表上绘制三个参数bf.bt
,bf.qft
和geom_line
,因此我尝试将data.frame从宽格式转换为长格式tidyr
library(tidyr)
df <- tidyr::gather(df, "parameter", "value", 2:4)
我收到了这个错误
Error: Position must be between 0 and n
我检查了df
,发现BaseflowSeparation
函数在data.frame
bf
df
> str(df)
'data.frame': 1978 obs. of 3 variables:
$ date: Date, format: "2003-01-01" "2003-01-02" "2003-01-03" ...
$ flow: num 394151 995943 540053 1109771 1178816 ...
$ bf :'data.frame': 1978 obs. of 2 variables:
..$ bt : num 168374 171233 172381 150429 120018 ...
..$ qft: num 178506 824710 367671 959342 1058798 ...
有关如何将BaseflowSeparation
函数的输出作为两列而非新data.frame
的任何建议?
答案 0 :(得分:1)
使用dplyr group_by按站点执行计算,然后使用do将BaseflowSeparation的结果与每个组的原始data.frame结合,然后取消组合到rbind组
df %>%
group_by(site) %>%
do(cbind(., BaseflowSeparation(.$flow, filter_parameter = 0.925, passes = 3))) %>%
ungroup()