user113156
user113156

Reputation: 7137

Applying function and spreading data in dplyr mutate/summarise

I am trying to compute some function and then spread my data based on the results.

Code & Data:

-- Preprocessing:

library(tidyquant)
library(tsfeatures)

data(FANG)

FANG_returns <- FANG %>%
  group_by(symbol) %>%
  tq_transmute(select     = adjusted, 
               mutate_fun = periodReturn, 
               period     = "daily", 
               type       = "arithmetic")

FANG_returns

Code which works:

FANG_returns %>%
  filter(symbol == "FB") %>%
  mutate(ent = entropy(daily.returns))

Code which doesn't work:

FANG_returns %>%
  filter(symbol == "FB") %>%
  mutate(max = max_level_shift(daily.returns))

Error:

Error: Column max must be length 1008 (the group size) or one, not 2

The function max_level_shift returns two columns:

max_level_shift(AirPassengers)
#>  max_level_shift time_level_shift 
#>             54.5            117.0

How can I spread my data such that I have my data in the following way:

> FANG_returns %>%
+   filter(symbol == "FB") %>%
+   summarise(ent = entropy(daily.returns))
# A tibble: 1 x 2
  symbol   ent   max_level_shift time_level_shift
  <chr>  <dbl>         <dbl>           <dbl>
1 FB     0.991       0.0573yyy       0.92764zzzz 

Any pointers would be great.

Upvotes: 0

Views: 48

Answers (1)

A. Suliman
A. Suliman

Reputation: 13135

Instead of using spread, we can just subset max_level_shift(daily.returns) by positions, as we know max will be in the first position and time in the 2nd position.

library(tidyquant)
library(tsfeatures)
FANG_returns %>%
filter(symbol == "FB") %>%
summarise(ent = entropy(daily.returns) ,
          max_level_shift = max_level_shift(daily.returns)[1], 
          time_level_shift = max_level_shift(daily.returns)[2])

# A tibble: 1 x 4
   symbol   ent max_level_shift time_level_shift
   <chr>  <dbl>           <dbl>            <dbl>
 1 FB     0.991          0.0484              141

#2nd option 
FANG_returns %>%
filter(symbol == "FB") %>%
summarise(ent = entropy(daily.returns) , 
          max = paste(max_level_shift(daily.returns), collapse = '-')) %>% 
separate(max, into=c('max_level_shift','time_level_shift'), sep = '-', convert = TRUE)

Upvotes: 1

Related Questions