加入两个时间序列,如果第二个数据帧中有数值,则用NA代替

问题描述 投票:1回答:1

我有两个不同的时间序列数据帧,如果第二个时间序列数据帧中存在数值,我只想加入一个替换为na的条件。在这里您可以找到相关的数据框。

library(lubridate)

first_df = data.frame(date = seq(ymd_hm("2019.12.01 00:00"),ymd_hm("2019.12.01 05:00"),by=3600), t1=c(1:6),t2=(7:12),t3=c(13:18),t4=c(19:24),stringsAsFactors = F)

first_df[-1]=apply(first_df[-1], c(1,2), as.numeric)

print(first_df)

                 date t1 t2 t3 t4
1 2019-12-01 00:00:00  1  7 13 19
2 2019-12-01 01:00:00  2  8 14 20
3 2019-12-01 02:00:00  3  9 15 21
4 2019-12-01 03:00:00  4 10 16 22
5 2019-12-01 04:00:00  5 11 17 23
6 2019-12-01 05:00:00  6 12 18 24

second_df = data.frame(date = seq(ymd_hm("2019.12.01 01:00"),ymd_hm("2019.12.01 04:00"),by=3600), t2=c(31,"NaN","NaN",34),t3=c(37:40),stringsAsFactors = F)

second_df[-1]=apply(second_df[-1], c(1,2), as.numeric)

print(second_df)

                 date  t2 t3
1 2019-12-01 01:00:00  31 37
2 2019-12-01 02:00:00 NaN 38
3 2019-12-01 03:00:00 NaN 39
4 2019-12-01 04:00:00  34 40

因此,所需的输出也可以在下面找到。

                 date t1 t2 t3 t4
1 2019-12-01 00:00:00  1  7 13 19
2 2019-12-01 01:00:00  2 NA NA 20
3 2019-12-01 02:00:00  3  9 NA 21
4 2019-12-01 03:00:00  4 10 NA 22
5 2019-12-01 04:00:00  5 NA NA 23
6 2019-12-01 05:00:00  6 12 18 24

我只想继续使用dplyr,但是任何回答都将不胜感激。顺便说一句,second_df中的“ NaN”值来自xts包,同时取小时平均值。

注:按日期将这两个数据帧完全连接,并在连接之后,采用second_df数值的相关TRUE索引是一种选择。然后,通过使用这些索引,可以将相关值替换为first_df中的NA。但是,我也认为这不是解决我问题的最佳方法?

注2:我刚刚添加了“ stringAsFactors = F”,并在警告StupidWolf的情况下使数据框中的所有值成为数字。现在,我正在努力处理的两个数据帧都具有相同的结构。

r join merge dplyr tidyverse
1个回答
1
投票

如果您这样做:

tochange = second_df[,c("t2","t3")] != "NaN"
tochange

        t2   t3
[1,]  TRUE TRUE
[2,] FALSE TRUE
[3,] FALSE TRUE
[4,]  TRUE TRUE

您可以在第二个data.frame中看到需要替换的值的布尔值。因此,只需在第一个数据框中找到与日期值匹配的四行即可:

# get the rows
rowIdx = match(second_df$date,first_df$date)
# specify rows, columns then the boolean
first_df[rowIdx,c("t2","t3")][tochange] = NA
first_df

                 date t1 t2 t3 t4
1 2019-12-01 00:00:00  1  7 13 19
2 2019-12-01 01:00:00  2 NA NA 20
3 2019-12-01 02:00:00  3  9 NA 21
4 2019-12-01 03:00:00  4 10 NA 22
5 2019-12-01 04:00:00  5 NA NA 23
6 2019-12-01 05:00:00  6 12 18 24

尽管,我必须补充一点,我发现second_df确实很奇怪。 t2是一个因数,t3是一个整数。因此,如果非数字为“ NaN”,则此代码有效。但是,如果日期以外的所有列都是整数,则可以使用!is.na查找数字列。

© www.soinside.com 2019 - 2024. All rights reserved.