【问题标题】:R Beginner Question Data Frame Conversion to Time SeriesR初学者问题数据帧转换为时间序列
【发布时间】:2016-03-21 08:27:37
【问题描述】:

我有一个包含长格式数据的平面 csv 文件,需要将其转换为时间序列对象。文件格式如下:

DATE       ID  REGION VALUE
2016-03-10 10  DE001  2332,23
2016-03-10 10  DE001  2332,23
2016-03-10 10  DE002  2332,23
2016-03-10 11  DE001  2332,23
2016-03-10 11  DE002  2332,23
2016-03-10 12  DE001  2332,23
2016-03-11 10  DE001  2332,23
2016-03-11 10  DE001  2332,23
2016-03-11 10  DE002  2332,23
2016-03-11 11  DE001  2332,23
2016-03-11 11  DE002  2332,23
2016-03-11 12  DE001  2332,23

我想先按 ID 分组,然后按地区分组,以便每个 ID 组都有不同的时间序列,其中包含针对完整可用时间跨度的多个区域观测值。

【问题讨论】:

  • 是的。我总共有大约 13 个 ID,我想为每个 ID 创建单独的时间序列对象。

标签: r time-series


【解决方案1】:

我误解了 OP 的问题。

您可以使用 tapply 分解原始数据框(称为 D)。 这有点棘手。你不能轻易改变tapply中的D

D$relTime <- NA 

L=tapply(1:nrow(D),D$ID, function(x) {
    # x contains the row numbers for each ID
    RT <- data.frame(row=x)
    T0 <- D$DATE[x][1]
    RT$val <- D$DATE[x]-T0 # if time series means offset from a base time
    RT
})
DL <- do.call('rbind',L)
# assuming you want it in  D
D$relTime[DL$row] <- DL$val

这将创建一个新列,其中包含每个 ID 与基准时间的偏移量。

编辑:我使用 '=' 进行评估,这不是最佳实践。我已经在上面更改了它们。

【讨论】:

    【解决方案2】:

    您可以使用 as.Date 函数。 使用 read.table("filename.csv") 加载表。除非您在 read.table 调用中指定 stringsAsFactors=FALSE,否则日期将作为因子加载。但是,这样做将适用于所有字符列。

    所以,

    D <- read.table("file.csv")
    D$DATE <- as.Date(as.character(D$DATE), "%Y-%m-%d")
    

    应该可以解决问题。 as.character 将确保日期作为字符串传递给 as.Date,即使它们已作为因子加载

    更多信息:

    https://stat.ethz.ch/R-manual/R-devel/library/base/html/as.Date.html

    https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html

    从技术上讲,它不是 csv 文件,因为“csv”中的“c”表示“逗号”。您的分隔符是空格。但是,如果您在调用中指定 sep=' ',您仍然可以使用 read.csv 调用。

    【讨论】:

    • 我已成功导入数据并将日期列声明为日期变量,但我遇到的主要问题仍然是将现有数据拆分为多个 timeSeries 对象。
    • 好的,我误解了你的问题。你可以使用 tapply 来做到这一点。我会做一个新的答案或编辑以上内容。
    猜你喜欢
    • 2021-12-05
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2017-12-13
    • 2022-11-01
    相关资源
    最近更新 更多