R函数在我的data.frame中创建一个新的data.frame

时间:2016-04-23 05:49:12

标签: r dataframe

使用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 flowBaseflowSeparation分开。

library(EcoHydRology)
df$bf <- BaseflowSeparation(df$flow, filter_parameter = 0.925, passes = 3)

该函数会创建两个新列bf.btbf.qft

我想使用flow在一个图表上绘制三个参数bf.btbf.qftgeom_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的任何建议?

1 个答案:

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