如何根据 R 中不同列中的 date/time 范围更改 1 列中的值
How to change values in 1 column based of date/time range in a different column in R
我有一个包含 DATE/TIME 列和一个包含一些数值的列的数据框。我想根据记录的 DATE/TIME 范围将一些数值更改为 "N/A"
。
这就是我的 dataframe
的样子
df = structure(list(Date_Time_GMT_3 = structure(c(1592226000, 1592226900,
1592227800, 1592228700, 1592229600, 1592230500), class = c("POSIXct",
"POSIXt"), tzone = "EST"), diff_20676892_AIR_X3lh = c(NA, 0.385999999999999,
0.193, 0.290000000000001, 0.385, 0.576000000000001), diff_20819828_B1LH_DOUBLE_CHECK = c(NA,
0, 0, 0, 0.0949999999999989, 0)), row.names = c(NA, 6L), class = "data.frame")
我想将 diff_20819828_B1LH_DOUBLE_CHECK
的所有值更改为 N/A
,如果它们介于 2020-06-15 08:30:00
和 2020-06-15 09:00:00
之间
我试过这个代码
df[df$Date_Time_GMT_3 > "2020-06-15 08:30:00"| < "2020-06-15 09:00:00"] = "NA"
但毫不奇怪,这不起作用。我该如何解决这个问题?
您的日期列在“EST”中,因此您可以这样做:
df[df$Date_Time_GMT_3 > as.POSIXct("2020-06-15 08:30:00", tz="EST") &
df$Date_Time_GMT_3 < as.POSIXct("2020-06-15 09:00:00", tz="EST"),3] <- NA
Date_Time_GMT_3 diff_20676892_AIR_X3lh diff_20819828_B1LH_DOUBLE_CHECK
1 2020-06-15 08:00:00 NA NA
2 2020-06-15 08:15:00 0.386 0.000
3 2020-06-15 08:30:00 0.193 0.000
4 2020-06-15 08:45:00 0.290 NA
5 2020-06-15 09:00:00 0.385 0.095
6 2020-06-15 09:15:00 0.576 0.000
请注意,在这些时间之间只有一行,第 4 行及以上将此类行的第 3 列中的值更改为 NA
您的基本 R 代码无法正常工作,因为
- 您没有指定应更改哪一列的值
- 您使用的是
|
而不是 &
- 在逻辑运算符之后,您需要重复要评估的向量
- 你没有告诉 R 这些字符串是 date-times.
浪塘的解决方案很巧妙。使用 dplyr
和 lubridate
的另一个选项是:
library(dplyr)
library(lubridate)
df %>% mutate(diff_20819828_B1LH_DOUBLE_CHECK = na_if(
diff_20819828_B1LH_DOUBLE_CHECK,
Date_Time_GMT_3 %within% interval("2020-06-15 08:30:00", "2020-06-15 09:00:00")
))
我有一个包含 DATE/TIME 列和一个包含一些数值的列的数据框。我想根据记录的 DATE/TIME 范围将一些数值更改为 "N/A"
。
这就是我的 dataframe
的样子
df = structure(list(Date_Time_GMT_3 = structure(c(1592226000, 1592226900,
1592227800, 1592228700, 1592229600, 1592230500), class = c("POSIXct",
"POSIXt"), tzone = "EST"), diff_20676892_AIR_X3lh = c(NA, 0.385999999999999,
0.193, 0.290000000000001, 0.385, 0.576000000000001), diff_20819828_B1LH_DOUBLE_CHECK = c(NA,
0, 0, 0, 0.0949999999999989, 0)), row.names = c(NA, 6L), class = "data.frame")
我想将 diff_20819828_B1LH_DOUBLE_CHECK
的所有值更改为 N/A
,如果它们介于 2020-06-15 08:30:00
和 2020-06-15 09:00:00
我试过这个代码
df[df$Date_Time_GMT_3 > "2020-06-15 08:30:00"| < "2020-06-15 09:00:00"] = "NA"
但毫不奇怪,这不起作用。我该如何解决这个问题?
您的日期列在“EST”中,因此您可以这样做:
df[df$Date_Time_GMT_3 > as.POSIXct("2020-06-15 08:30:00", tz="EST") &
df$Date_Time_GMT_3 < as.POSIXct("2020-06-15 09:00:00", tz="EST"),3] <- NA
Date_Time_GMT_3 diff_20676892_AIR_X3lh diff_20819828_B1LH_DOUBLE_CHECK
1 2020-06-15 08:00:00 NA NA
2 2020-06-15 08:15:00 0.386 0.000
3 2020-06-15 08:30:00 0.193 0.000
4 2020-06-15 08:45:00 0.290 NA
5 2020-06-15 09:00:00 0.385 0.095
6 2020-06-15 09:15:00 0.576 0.000
请注意,在这些时间之间只有一行,第 4 行及以上将此类行的第 3 列中的值更改为 NA
您的基本 R 代码无法正常工作,因为
- 您没有指定应更改哪一列的值
- 您使用的是
|
而不是&
- 在逻辑运算符之后,您需要重复要评估的向量
- 你没有告诉 R 这些字符串是 date-times.
浪塘的解决方案很巧妙。使用 dplyr
和 lubridate
的另一个选项是:
library(dplyr)
library(lubridate)
df %>% mutate(diff_20819828_B1LH_DOUBLE_CHECK = na_if(
diff_20819828_B1LH_DOUBLE_CHECK,
Date_Time_GMT_3 %within% interval("2020-06-15 08:30:00", "2020-06-15 09:00:00")
))