在给定的时间间隔内使用ifelse()语句处理日期时间观测数据

3
我希望能够根据df$date中的特定时间间隔给df$lamp_intensity向量分配一个值。如果某个观测值超出此间隔,则我想要赋值为NA。一旦我让这段代码起作用,我计划嵌套一堆ifelse()语句来处理多个时间间隔。我认为我已经非常接近了,但我肯定需要帮助。
谢谢!
以下是我的数据:
df <- structure(list(date = structure(c(1504787028, 1504787030, 1504787031, 1504787032, 1504787033, 1504787034, 1504787035, 1504787036, 1504787037, 1504787038), class = c("POSIXct", "POSIXt"), tzone = "UTC"), ppm = c(0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.0009765625, 0.00146484375)), .Names = c("date", "ppm"), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

df$lamp_intensity <- ifelse(df$date >= as.POSIXct("2017-09-07 12:23:51",
    format = "%Y-%m-%d %H:%M:%S", tz = "UTC") && ## using '&' generates an error message
    date <= as.POSIXct("2017-09-07 12:23:55",
    format = "%Y-%m-%d %H:%M:%S", tz = "UTC"), 0, NA)

head(df, 10)

该方案将为 2017-09-07 12:23:512017-09-07 12:23:55 期间 df$lamp_intensity 的行分配 0

date <= as.POSIXct("2017-09-07 12:23:55") 应该为 df$date <= as.POSIXct("2017-09-07 12:23:55")。这就是你在使用 & 运算符时出现错误的原因。 - eipi10
2个回答

2
你可以使用cut函数。例如:
df$lamp_intensity = cut(df$date, 
                        breaks=as.POSIXct(c("2017-09-07 12:23:42","2017-09-07 12:23:55",
                                            "2017-09-07 12:24:02", "2017-09-07 12:24:31"), tz="UTC"),
                        labels=c(0,1,2))

                  date          ppm lamp_intensity
 1 2017-09-07 12:23:48 0.0009765625              0
 2 2017-09-07 12:23:50 0.0009765625              0
 3 2017-09-07 12:23:51 0.0009765625              0
 4 2017-09-07 12:23:52 0.0009765625              0
 5 2017-09-07 12:23:53 0.0009765625              0
 6 2017-09-07 12:23:54 0.0009765625              0
 7 2017-09-07 12:23:55 0.0009765625              1
 8 2017-09-07 12:23:56 0.0009765625              1
 9 2017-09-07 12:23:57 0.0009765625              1
10 2017-09-07 12:23:58 0.0014648438              1

你的例子是有效的,但是当我试图将其扩展以包括约10个不同的时间间隔时,我一直收到“'breaks'和'labels'的长度不同”的错误。我注意到你包含了三个标签,但只有两个断点。我将其扩展到10个断点和11个标签,但仍然出现此错误。cut()是否要求我们为df中的每个观测值定义断点?如果是这样,那么嵌套的ifelse()语句对我更有用。 - philiporlando
1
是的,你需要提供比你想要的间隔数多一个断点值。例如,如果你想要两个间隔,就需要指定端点加上中间的一个点,总共三个点。(请注意,我更新了我的答案,包括三个标签,因此有四个断点。) - eipi10

1
似乎很简单。
start <- as.POSIXct("2017-09-07 12:23:51", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
end <- as.POSIXct("2017-09-07 12:23:55", format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
df$lamp_intensity <- ifelse(start <= df$date & df$date <= end, 0, NA)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接