首页 > 解决方案 > 计算 R 中每一天的对数差异 为每一天的第一次观察产生 NA

问题描述

问题:计算每天的对数差异(每天分组)。理想的结果应该为每天的第一次观察产生 NA。

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

标签: rgroup-bydplyr

解决方案


切勿$dplyr管道中使用,您还需要附加NAdiff输出

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 

推荐阅读