Преобразование фрейма данных dplyr в список объектов временных рядов в R - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть следующий фрейм данных:

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", чтобы я мог определить, какой ряд какой?

Большое спасибо!

1 Ответ

2 голосов
/ 27 февраля 2020

Мы можем использовать 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>  

data

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"))
...