purrr :: map和lag函数,带嵌套数据框的语法

时间:2019-11-25 14:45:48

标签: r purrr lag

我正在努力对嵌套数据帧上的元素执行操作的语法。使用此示例:

> df1 <- tibble(P=c(101,101,102,102,103,103,101,101,102,102,103,103))
> df2 <- tibble(C=c(1,2,1,2,1,2,1,2,1,2,1,2))
> df3 <- tibble(SmpDate=as.Date(c("2019-11-01","2019-11-01","2019-11-01","2019-11-01","2019-11-01","2019-11-01","2019-11-02","2019-11-02","2019-11-02","2019-11-02","2019-11-02","2019-11-02")))
> df4 <- tibble(Fl=round(runif(12,0.1,5),2))
> df <- data.frame(df1,df2,df3,df4) #create the data.frame
> df_n <- df %>% group_by(P,C,SmpDate) %>% nest(data=c(SmpDate,Fl))
> 
> glimpse(df_n)
Observations: 6
Variables: 3
Groups: P, C [6]
$ P    <dbl> 101, 101, 102, 102, 103, 103
$ C    <dbl> 1, 2, 1, 2, 1, 2
$ data <list<df[,2]>> 18201.00, 18202.00, 0.50, 3.11, 18201.00, 18202.00, 2.04, 0.86, 18201.00, 18202.00, 2.07, 1.59, 18201.00, 18202.00, 4.51, 2.83, 18201.0...
> 

我想使用滞后函数和一些条件语句对数据列表中的Fl变量和SmpDate执行操作。我了解我应该能够使用purrr :: map函数,但似乎无法正确地使用语法来解决各个元素。 例如,请记住我意识到这是行不通的:

cp1<-function(df){
day(SmpDate)*Fl
}
cp2<-function(df){
  (SmpDate-lag(SmpDate,n=1L))*Fl
}

使用基于SmpDate的变异和条件,我将选择要应用的功能。

1 个答案:

答案 0 :(得分:0)

这里是对某事的尝试。但是您的帖子缺乏足够的背景信息,这种方法才有意义。


df_n %>% 
  mutate(
    cp1 = data %>% map(. %>% pmap(function(SmpDate, Fl, ...) {
      lubridate::day(SmpDate)*Fl
    })),

    cp2 = data %>% map(. %>% pmap(function(SmpDate, Fl, ...) {
      (SmpDate-lag(SmpDate,n=1L))*Fl
    }))
  ) %>% 
  # unnest(c(cp1, cp2))
  identity()