【问题标题】:Can I have arrays or similar data structure as elements of a data frame?我可以将数组或类似的数据结构作为数据框的元素吗?
【发布时间】:2020-04-21 21:13:12
【问题描述】:

我需要像下面这样的数据框吗?

   Label        Time          Value
    "X"       [0, 1, 2]   [1.1, 1.5, 2.1] 
    "Y"       [0, 1, 2]   [2.1, 3.1, 4.5]
    "Z"       [0, 1, 2]   [3.3, 3.5, 4.2]

我想要一个数据框,其中有一列表示时间序列标签,另一列表示时间属性,另一列表示时间序列。理想情况下,向量/序列的长度不相等。

如果这不可能,请告知如何最好地对数据建模,其中我有数以万计的时间序列可能不同的长度,每个时间序列都与一个多部分标签相关联。

我的问题是我有一个格式为:

ID  Type  Num  Tag  Time  Value
X    A     1    T1   0.0   1.1
             ...
X    A     1    T1   0.9   2.1
             ...
X    A     6    T4   0.0   3.1
             ...
X    A     6    T4   0.6   4.5
             ...
Y    C     5    T3   0.0   3.3
             ...
Y    C     5    T3   0.8   4.2

我正在寻找的是这样的:

ID  Type  Num  Tag         Time               Value
X    A     1    T1   c(0.0, ..., 0.9)   c(1.1, ..., 2.1)
                  ...
X    A     6    T4   c(0.0, ..., 0.6)   c(3.1, ..., 4.5) 
                  ...
X    C     5    T3   c(0.0, ..., 0.8)   c(3.3, ..., 4.2) 
                  ...

到目前为止,我取得的最好成绩是将向量缩减到相同的长度,然后将每个 Time 属性用作一个列,其中的值排序在下面。

*谢谢你*

【问题讨论】:

  • 您能解释一下为什么需要转换格式吗?毕竟,格式化不是建模。这种转换预期会完成什么?
  • 感谢您的快速响应......雇主更喜欢这种方式。 1.使用目标形式的数据进行聚类算法显然更直接一些,例如tsclust(...),使用时间序列的list! 2. 在原始形式中,PK 本质上是 (ID, Type, Num, Time),而在目标格式中,PK 是 (ID, Type, Num),这对我来说似乎也更合理。我需要为每种类型分别对系列列表进行聚类,并根据每个聚类中的标签数,以某种方式相应地标记每个聚类!!!奇怪,诶?!
  • data.frame(Label=c("X","Y","Z"), Time=I(list(0:2, 0:2, 0:2)), Value=I(list(c(1.1, 1.5, 2.1), c(2.1, 3.1, 4.5), c(3.3, 3.5, 4.2)))) 怎么样?

标签: r time-series


【解决方案1】:

您始终可以在 data.frame 下存储一个列表,但可以尝试以下方式:

library(tidyr)
library(dplyr)

dat = data.frame(ID=rep(c("X","Y"),c(4,2)),
Type=rep(c("A","C"),c(4,2)),
Num=rep(c(1,6,5),each=2),
Tag=rep(c("T1","T4","T3"),each=2),
Time=c(0,0.9,0,0.6,0,.8),
Value=c(1.1,2.1,3.1,4.5,3.3,4.2))

dat %>% nest(data=c(Value,Time))
# A tibble: 3 x 5
  ID    Type    Num Tag   data            
  <fct> <fct> <dbl> <fct> <list>          
1 X     A         1 T1    <tibble [2 × 2]>
2 X     A         6 T4    <tibble [2 × 2]>
3 Y     C         5 T3    <tibble [2 × 2]>

您可以像这样访问数据:

dat_nested = dat %>% nest(data=c(Value,Time))
dat_nested$data[[1]]
# A tibble: 2 x 2
  Value  Time
  <dbl> <dbl>
1   1.1   0  
2   2.1   0.9

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多