【问题标题】:An algorithm to check and replace missing data between 2 timeseries data一种用于检查和替换 2 个时间序列数据之间缺失数据的算法
【发布时间】:2019-11-27 03:12:01
【问题描述】:

我是这个平台和 R 的新手。

我有 2 个数据集,其中 (datasetA)70000 行和 (datasetB)10000 行。一个和 B 是相同的数据集,有 18 个变量。 我需要从 datasetA 中找到丢失的数据,并使用相同的时间戳从 datasetB 中替换(如果存在)它。

我尝试过合并、加入、匹配。

我想保留第一个数据集并替换第二个数据集中丢失的数据。

有没有没有循环的解决方案?

DatasetA
            Date     Time qK1 qL1 vP1 vL1 qK2
34900 20.06.2019 05:40:00  --  --  --  --  --
34901 20.06.2019 05:41:00  10   4 140  86   9
34902 20.06.2019 05:42:00  --  --  --  --  --
34903 20.06.2019 05:43:00   8   0 130   0   6
34904 20.06.2019 05:44:00  --  --  --  --  --
34905 20.06.2019 05:45:00  --  --  --  --  --
34906 20.06.2019 05:46:00   6   2 132  87   9
34907 20.06.2019 05:47:00  --  --  --  --  --
34908 20.06.2019 05:48:00  --  --  --  --  --
34909 20.06.2019 05:49:00   8   1 127  84   3
34910 20.06.2019 05:50:00  --  --  --  --  --
34911 20.06.2019 05:51:00  --  --  --  --  --
34912 20.06.2019 05:52:00  10   4 116 104   9
34913 20.06.2019 05:53:00  --  --  --  --  --
34914 20.06.2019 05:54:00   6   0 125   0  11
34915 20.06.2019 05:55:00  --  --  --  --  --
34916 20.06.2019 05:56:00  --  --  --  --  --
34917 20.06.2019 05:57:00   5   4 130  93   7
34918 20.06.2019 05:58:00  --  --  --  --  --
34919 20.06.2019 05:59:00  --  --  --  --  --
34920 20.06.2019 06:00:00  --  --  --  --  --


DATASETB
                    Date  Time qK1 qL1 vP1 vL1 qK2
340 20.06.2019 05:39   5   1 123  88   7
341 20.06.2019 05:40   9   1 115 110   9
342 20.06.2019 05:41  10   4 140  86   9
343 20.06.2019 05:42   7   1 102  87   7
344 20.06.2019 05:43   8   0 130   0   6
345 20.06.2019 05:44   6   0 121   0   6
346 20.06.2019 05:45   7   0 122   0   9
347 20.06.2019 05:46   6   2 132  87   9
348 20.06.2019 05:47   4   1 128 101   6
349 20.06.2019 05:48   6   2 124  92   9
350 20.06.2019 05:49   8   1 127  84   3
351 20.06.2019 05:50   7   1 115  87   7
352 20.06.2019 05:51   7   0 130   0   4
353 20.06.2019 05:52  10   4 116 104   9
354 20.06.2019 05:53   9   1 126  85   8
355 20.06.2019 05:54   6   0 125   0  11
356 20.06.2019 05:55   5   1 125  86   8
357 20.06.2019 05:56   6   5  87  93   9
358 20.06.2019 05:57   5   4 130  93   7
359 20.06.2019 05:58   7   2 124  86   9
360 20.06.2019 05:59   5   1 120  89   7

I tried this basically, but it doesnt work due to length difference. 

DatasetA$timestamp <- as.POSIXct(paste(DatasetA$Date, DatasetA$Time), format = "%d.%m.%Y %H:%M:%S")
DatasetB$timestamp <- as.POSIXct(paste(DatasetB$Date, DatasetB$Time), format = "%d.%m.%Y %H:%M")
DatasetA[DatasetA$timestamp==DatasetB$timestamp,"qK1"]<-DatasetB$qK1

Error in `[<-.data.frame`(`*tmp*`, DatasetA$timestamp == DatasetB$timestamp, "qK1",  : 
  replacement has 10080 rows, data has 60482
In addition: Warning message:
In `==.default`(DatasetA$timestamp, DatasetB$timestamp) :
  longer object length is not a multiple of shorter object length

【问题讨论】:

  • 请给出一个示例数据集(例如dput(head(datasetA)))。您是缺少 A 中的行,还是仅缺少单个值?
  • 我已经提交了有问题的示例数据集。根本没有缺少原料。但是每个变量都有缺失值。要找出 i、j 逻辑和替换需要更长的循环。有没有可能在短时间内做到?
  • 没有可以加载的示例数据集。请使用dput() 的输出,以便我可以将数据集粘贴到我的 R 会话中并尝试使用它。
  • 感谢您的宝贵时间。我尝试输出 dput 但它需要很长的文本。相反,我放了一个广泛的示例,可以为您提供参考。
  • 正如我在问题中所描述的,数据集是大数据。时间戳有偏离路线的匹配。否则对此毫无意义。这只是 2 个数据集的示例,不仅可以帮助您理解这个概念,还可以在下面回答。

标签: r time-series missing-data


【解决方案1】:
    DatasetA$timestamp <- as.POSIXct(paste(DatasetA$Date, DatasetA$Time), 
    format = "%d.%m.%Y %H:%M:%S")
    DatasetB$timestamp <- as.POSIXct(paste(DatasetB$Date, DatasetB$Time),
    format = "%d.%m.%Y %H:%M")

    rownames(DatasetA)<-DatasetA$timestamp
    rownames(DatasetB)<-DatasetB$timestamp

    nas <- which(is.na(DatasetA), arr.ind=TRUE)
    nas.map <- data.frame(Row=rownames(DatasetA)[nas[,1]], 
                Col=colnames(DatasetA)[nas[,2]])

    for(i in 1:nrow(nas.map)) {
       DatasetA[ as.character(nas.map[i,1]) , as.character(nas.map[i,2]) ] <-
       DatasetB[ as.character(nas.map[i,1]) , as.character(nas.map[i,2])]
    }  

非常感谢@January。我按照你的建议解决了这个问题。只有我在循环(as.character)内做了小编辑,完成 140000 个缺失数据大约需要 2 分钟。

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2019-08-06
    • 2021-05-27
    • 2022-01-20
    • 2022-01-06
    • 2023-03-08
    相关资源
    最近更新 更多