R 连接两个时间序列,如果第二个数据帧中有数值,则替换为NA

R 连接两个时间序列,如果第二个数据帧中有数值,则替换为NA,r,join,merge,dplyr,tidyverse,R,Join,Merge,Dplyr,Tidyverse,我有两个不同的时间序列数据帧,如果第二个时间序列数据帧中有一个数值,我只想用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) fi

我有两个不同的时间序列数据帧,如果第二个时间序列数据帧中有一个数值,我只想用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,但任何答复都将不胜感激。顺便说一句,第二个_df中的“NaN”值来自xts包,同时取每小时平均值

注:按日期完全连接这两个数据帧,连接后,可选择第二个_df数值的相关真指数。然后,通过使用这些指数,相关值可以在第一个_df中替换为NA。然而,我也认为这不是解决我问题的最好办法


注2:我刚刚添加了“stringAsFactors=F”,并使数据帧中的所有值都是数字,并带有StupidWolf警告。现在我正在处理的两个数据帧的结构都是相同的。

您的数据可以不加引号地设置NaN

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)

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)
如果您这样做:

tochange = !is.na(second_df[,c("t2","t3")]) 
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

如果缺少的值是R中正确的NA值,则上述方法有效。请参阅,我认为最好确保变量使用此值。

对于数据帧带来的不便,非常抱歉。我刚刚编辑了代码,以便创建一个数据帧,就像我在R中挣扎一样。@Cyric,感谢您更新数据。我已经编辑了我的答案。它现在可以和你的数据框一起工作谢谢@StupidWolf。我尝试使用is.numeric代替!是的。即使我用apply函数尝试了它,它也没用。现在没事了。