我有两个不同的时间序列数据帧,如果第二个时间序列数据帧中存在数值,我只想加入一个替换为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的情况下使数据框中的所有值成为数字。现在,我正在努力处理的两个数据帧都具有相同的结构。
如果您这样做:
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查找数字列。