【问题标题】:Converting a dplyr data frame into a list of time series objects in R将 dplyr 数据框转换为 R 中的时间序列对象列表
【发布时间】:2020-02-27 10:43:46
【问题描述】:

我有以下数据框:

df <- read.csv("data.csv", header=TRUE)
> df
       ID     Time Expectation
1         cat  1.1           1
2         dog  1.0           2
3         dog  1.1           3
4  guinea_pig  1.0           7
5         cat  1.0           1
6  guinea_pig  3.8          10
7         cat  0.8           1
8         cat  2.1           1
9         cat  3.6           1
10 guinea_pig  3.0          16
11        dog  0.9           2
12 guinea_pig  2.7          15
13 guinea_pig  4.0          10
14        dog  5.2           6
15        dog  7.2           7

有人帮我列出了 ID 列中每个变量的期望值,按时间升序排列,如下:

library("dplyr")
df <- df %>%
group_by(ID) %>%
summarise(var = list(Expectation[order(Time)]))
> df
# A tibble: 3 x 2
ID         var      
<fct>      <list>   
1 cat        <int [5]>
2 dog        <int [5]>
3 guinea_pig <int [5]>

如何将上述内容转换为时间序列对象列表,同时保留“cat”/“dog”/“guinea_pig”标签,以便识别哪个系列是哪个?

非常感谢!

【问题讨论】:

    标签: r list dplyr time-series


    【解决方案1】:

    我们可以使用map/lapply并应用ts函数转换为时间序列对象。

    library(dplyr)
    
    df %>%
      group_by(ID) %>%
      summarise(var = list(Expectation[order(Time)]), 
                var_ts = purrr::map(var, ts))
                #Or with lapply
                #var_ts = lapply(var, ts)) 
    
    # A tibble: 3 x 3
    #  ID         var       var_ts
    #  <fct>      <list>    <list>
    #1 cat        <int [5]> <ts>  
    #2 dog        <int [5]> <ts>  
    #3 guinea_pig <int [5]> <ts>  
    

    数据

    df <- structure(list(ID = structure(c(1L, 2L, 2L, 3L, 1L, 3L, 1L, 1L, 
    1L, 3L, 2L, 3L, 3L, 2L, 2L), .Label = c("cat", "dog", "guinea_pig"
    ), class = "factor"), Time = c(1.1, 1, 1.1, 1, 1, 3.8, 0.8, 2.1, 
    3.6, 3, 0.9, 2.7, 4, 5.2, 7.2), Expectation = c(1L, 2L, 3L, 7L, 
    1L, 10L, 1L, 1L, 1L, 16L, 2L, 15L, 10L, 6L, 7L)), class = "data.frame", 
    row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
    "14", "15"))
    

    【讨论】:

    • 谢谢罗纳克!当我运行代码时,我得到:错误:列 var_ts 必须是长度 1(一个汇总值),而不是 5。你知道为什么吗?
    • @Abigail575 这很奇怪。它对我有用,没有任何错误。你能检查一下我在帖子中分享的数据是否适合你吗?此外,请尝试使用dplyr::summarise 而不仅仅是summarise
    • 谢谢,罗纳克。我将代码粘贴在您提供的“数据”下,紧接着是“library("dplyr") df % group_by(ID) %>% dplyr::summarise(var = list(Expectation[order(Time )]), var_ts = purrr::map(var, ts)) df" 我得到同样的错误!!很奇怪。
    • 如果我共享的数据也出现错误,您可以尝试更新软件包。我有packageVersion('dplyr') 作为‘0.8.3’packageVersion('purrr') 作为‘0.3.3’。不知道究竟是什么给了你这个错误,因为我无法重现。
    • 好的,我会尝试的 - 非常感谢您抽出时间来帮助我 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2020-06-21
    • 1970-01-01
    • 2021-12-23
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多