【问题标题】:Separate data into multiple time series R将数据分成多个时间序列 R
【发布时间】:2021-03-14 14:32:38
【问题描述】:

我有一张包含美国所有州的 Excel 表格。我想从每个州创建一个时间序列,并将数据频率设为每天(目前是按分钟)。到目前为止,我所做的最多的是删除所有多余的列,但我很难想出一种有效的方法来每天制作数据并按状态分隔,而无需手动执行。

我希望将 ggplot 与所有这些新的时间序列一起使用。我试过使用melt函数和gather函数,但都不起作用。

这是我的部分数据:

状态栏从 1 到 51 并且日期不时重复,因为它的频率是每分钟。我想最终为这些状态中的每一个创建一个时间序列,以便我可以并排分析它们。有些州可能没有每天的数据记录,如何自动将这些日期填为零?

【问题讨论】:

  • 每日价值应该如何计算?比如说,所有 VE_TOTALS、VE_FORMS 等是否应该按州/天求和?
  • 是的!但是每一列都是分开的,这样我就可以看到哪些列具有最有意义的值并选择它。但我希望它们被@NicolásVelásquez 合计

标签: r excel


【解决方案1】:

欢迎来到 SO,樱桃。将来,请提供可重现的示例,而不是数据框的图片。 dput(your_df_here) 函数可能有用。

这是我的示例数据,与您的不同:

df <- structure(list(STATE = c(1, 1, 1, 2, 2, 2), VETOTAL = c(2, 2, 3, 1, 1, 2), VEFORMS = c(2, 2, 3, 1, 1, 2), 
           PVHJNVL = c(0, 0, 0, 0, 0, 0), PEDS = c(0, 0, 0, 1, 0, 0), PERSONS = c(3, 2, 4, 1, 1, 2), 
           PERMVIT = c(3, 2, 4, 1, 1, 2), PERNOTMVI = c(0, 0, 0, 1, 0, 0), COUNTY = c(81, 55, 29, 55, 3, 85), 
           CITY = c(2340, 1280, 0, 2562, 0, 0), DAY = c(7, 23, 22, 7, 23, 22), MONTH = c(2, 1, 1, 2, 1, 1), 
           YEAR = c(2019, 2019, 2019, 2019, 2019, 2019), FATALS = c(1, 1, 1, 1, 0, 1), DRUNK_DR = c(1, 0, 0, 0, 1, 0)), 
       row.names = c(NA, -6L), class = "data.frame")

下面是如何在{tidyverse} 的帮助下创建一个日期观察,按州和日期分组,然后总结一个总和。

library(tidyverse)
df %>% 
   mutate(date = as.Date(paste(YEAR, MONTH, DAY, sep = "-"))) %>% # create a date
   group_by(STATE, date) %>% # Group by State id and date
   summarise_at(.vars = vars(VETOTAL:PERNOTMVI, FATALS, DRUNK_DR), sum) ## Summarise a sum of those variables between VETOTAL and PERNOTMVI, plus FATALS and DRUNK_DR

结果:

# A tibble: 6 x 10
# Groups:   STATE [2]
  STATE date       VETOTAL VEFORMS PVHJNVL  PEDS PERSONS PERMVIT PERNOTMVI FATALS
  <dbl> <date>       <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>     <dbl>  <dbl>
1     1 2019-01-22       3       3       0     0       4       4         0      1
2     1 2019-01-23       2       2       0     0       2       2         0      1
3     1 2019-02-07       2       2       0     0       3       3         0      1
4     2 2019-01-22       2       2       0     0       2       2         0      1
5     2 2019-01-23       1       1       0     0       1       1         0      0
6     2 2019-02-07       1       1       0     1       1       1         1      1

填写缺失的日期。

如果您想用 0 填充某个范围内缺失日期的值(即那些没有记录观察的日期),我们可以在 {padr} 的帮助下这样做

library(padr)
    df %>% 
  mutate(date = as.Date(paste(YEAR, MONTH, DAY, sep = "-"))) %>% 
  group_by(STATE, date) %>% 
  summarise_at(.vars = vars(VETOTAL:PERNOTMVI, FATALS), sum) %>% 
  padr::pad(start_val = min(.$date), #This sets the start value as the earliest date present in the "date" variable 
            end_val = max(.$date)) %>%    #This sets the end value as the earliest date present in the "date" variable
  fill_by_value(value = 0)

结果:

# A tibble: 34 x 10
# Groups:   STATE [2]
   STATE date       VETOTAL VEFORMS PVHJNVL  PEDS PERSONS PERMVIT PERNOTMVI FATALS
   <dbl> <date>       <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>     <dbl>  <dbl>
 1     1 2019-01-22       3       3       0     0       4       4         0      1
 2     1 2019-01-23       2       2       0     0       2       2         0      1
 3     1 2019-01-24       0       0       0     0       0       0         0      0
 4     1 2019-01-25       0       0       0     0       0       0         0      0
 5     1 2019-01-26       0       0       0     0       0       0         0      0
 6     1 2019-01-27       0       0       0     0       0       0         0      0
 7     1 2019-01-28       0       0       0     0       0       0         0      0
 8     1 2019-01-29       0       0       0     0       0       0         0      0
 9     1 2019-01-30       0       0       0     0       0       0         0      0
10     1 2019-01-31       0       0       0     0       0       0         0      0
# ... with 24 more rows

【讨论】:

  • 下次一定要使用这个功能!谢谢!虽然,我有一个问题。如果我想把它变成一个时间序列,我知道使用 df_ts=ts(df$'STATE',freq=365,start=c(2019,1)) 可以说。但是在您给我的示例数据中,它仍然在同一日期多次显示状态 1 之类的状态。有没有办法把你的第一排和第四排结合起来?所以它是针对 ve_total、veform 等为某一日期打印的一个州的值? @NicolásVelásquez
  • 我想我在 group_by() 和 summarise_at() 行中做到了。看看第 1 行如何列出 STATE == 1,而第 4 行如何列出 STATE == 2。
  • 哦,是的,我正在查看两种不同的状态,您是对的。所以现在,如果我将以下部分添加到您的代码中: %>% filter(STATE=='1') 我看到我得到了 325 行,这很奇怪,因为它不应该是 365 吗?因为如果我尝试继续创建我的时间序列,写 state1_ts=ts(state1$'VE_TOTAL', freq=365, start=c(2019,1)) 我会得到一个奇怪的两列集。或者也许按状态过滤没有意义,因为我希望每个状态都有一个时间序列。抱歉还是有点失落@Nicolás Velásquez
  • 嗨樱桃。我的猜测是,State #1 在 365 天中只有 325 天的记录。我想这样的州不是佛罗里达州,因为我以前每天都从窗户看到事故。如果您需要填写 0 天无事故,请将请求添加到您的帖子中。
  • 哈哈,那你应该负责佛罗里达州的崩溃数据!我现在会添加它。@Nicolás Velásquez
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2017-11-15
  • 2017-09-14
  • 2023-04-02
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多