首页 > 解决方案 > 在 R 中创建 BIG 时空时间序列数据

问题描述

我想在研究区域的 255 个不同位置创建一个时间序列每日数据框(从 2006 年 1 月 1 日到 2018 年 12 月 31 日 - 4749 行)。因此,所需的表(如下所示,表 1)应该在 255 个唯一位置具有重复的日期行,从 1Jan2006 到 31dec2018(总计:1210995 行)。我稍后想将这个新表与另一个数据(如下所示,表 2)连接起来,该数据在每个位置的 255 列中填充了每日温度值。这是我的数据的样子:

表 1 表 1 所需的最终时间序列表将日期表示为 255 个不同位置的块,其中临时变量作为新列

(

Date Location Temp Value Chunk_id 1/1/2006 Location1 29.6oC 1 . 位置 1 .. 1 . 位置 1 .. 1 . .. .. 1 1/31/2018 .. .. 1 1/1/2006 地点 2 32.1oC 2 . 位置 2 31.1oC 2 。位置 2 .. 2 2018 年 1 月 31 日 ... .. 2 )

这是我拥有并想要转换的数据

表 2

表 2 不同领域给出的不同地点的日气温数据

( 日期 地点 1 地点 2 ....... 地点 255 2006 年 1 月 1 日 29.6oC 32.1oC 31.1oC 2006 年 1 月 2 日 32.0oC 33.1oC 32.5oC 2006 年 1 月 3 日 35.6oC 34.1oC 34.2oC ...... ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ( )

请注意,我仍在为 R 苦苦挣扎,因此非常感谢您提供全面的答案。太感谢了。

标签: rdatabase

解决方案


这是我想出的代码,它应该将数据的形状从您拥有的格式转换为您想要的格式。您必须进一步澄清的一件事是“Chunk_ID”列的来源。

正如您在下面看到的,我使用 data.table 和 string 包。

library(data.table)
library(stringr)

dt <- data.table(Date = c('2006.01.01', '2006.01.02'), 
                 location1 = c(22.2, 24.6),
                 location2 = c(22.5, 24.7))

melted <- melt(dt, id.vars = c('Date')) 

melted[,`:=`(variable = str_sub(variable, 9, 9))]

setnames(melted, c("variable","value"), c("Location","Temperature_values"))

如果您想要除了代码之外的一些描述,请告诉我。

编辑:附加说明。

感谢您提供有关 chunk_id 列的信息。我不明白为什么有必要。根据您提供的示例,它似乎包含与位置列相同的值。

首先,我真的推荐使用 datatable 包,因为它非常快,其次它的语法非常简洁。假设您有一个 csv 文件,您只需以这种方式导入它(确保您在正确的目录中或包含完整/绝对文件名):

df <- fread('your_file.csv')

下一步只是将数据从宽格式重塑为长格式。这是由数据表的melt功能完成的,是转换数据的关键步骤。如您所见,id 列(名为 id.vars)是您的“日期”列。接下来是提取每个位置的编号。在原始 df 中,列被命名为“location1”、“location2”等。在最终的 df 中,我只看到了每个位置的编号,因此我们使用strings_substringr 包中的函数提取了最后一个字符。最后,我们将使用数据表中的setnames函数重命名列。首先你有旧的列名,然后是新的列名。这意味着“变量”列被重命名为“位置”。

如果您现在能够转换数据,请告诉我。


推荐阅读