Рассчитайте логарифмическую разницу для каждого дня в R. Создайте NA для первого наблюдения для каждого дня. - PullRequest
1 голос
/ 11 октября 2019

Проблема: Рассчитайте разницу в журнале за каждый день (сгруппируйте по дням). Идеальный результат должен давать НС для первого наблюдения за каждый день.

library(dplyr)
library(tidyverse)
library(tibble)
library(lubridate)
df <- tibble(t = c("2019-10-01 09:30", "2019-10-01 09:35", "2019-10-01 09:40", "2019-10-02 09:30", "2019-10-02 09:35", "2019-10-02 09:40", "2019-10-03 09:30", "2019-10-03 09:35", "2019-10-03 09:40"), v = c(105.0061, 104.891, 104.8321, 104.5552, 104.4407, 104.5837, 104.5534, 103.6992, 103.5851)) # data

# my attempt
df %>% 
  # create day
  mutate(day = day(t)) %>%
  # group by day
  group_by(day) %>%
  # calculate log difference and append column
  mutate(logdif = diff(log(df$v)))

Проблема в

Error: Column `logdif` must be length 3 (the group size) or one, not 8

Что мне нужно:

[1]            NA -0.0010967280 -0.0005616930        NA         -0.0010957154
[6]  0.0013682615            NA -0.0082035450 -0.0011009036

1 Ответ

4 голосов
/ 11 октября 2019

Никогда не используйте $ в dplyr трубах, также вам нужно добавить NA к diff выводу

library(dplyr)

df %>% 
  mutate(day = lubridate::day(t)) %>%
  group_by(day) %>%
  mutate(logdif = c(NA, diff(log(v))))

#   t                 v   day     logdif
#  <chr>            <dbl> <int>     <dbl>
#1 2019-10-01 09:30  105.     1       NA       
#2 2019-10-01 09:35  105.     1 -0.00110 
#3 2019-10-01 09:40  105.     1 -0.000562
#4 2019-10-02 09:30  105.     2       NA       
#5 2019-10-02 09:35  104.     2 -0.00110 
#6 2019-10-02 09:40  105.     2  0.00137 
#7 2019-10-03 09:30  105.     3       NA       
#8 2019-10-03 09:35  104.     3 -0.00820 
#9 2019-10-03 09:40  104.     3 -0.00110 
...