我有一个包含一些日期/时间信息的小数据集。例如:
type start end price time
rental location A Location B 0 23:50:00
rental location A Location B 0 18:32:00
rental location A Location B 0 10:10:00
rental location A Location B 0 09:54:00
rental location A Location B 0 20:48:00
我想在 R 中编写一组 if/or 语句来创建一个新列(价格),以显示高峰时间和非高峰时间的价格。这是一个显示自行车租赁时间的数据集,我想将其与高峰时段公共交通出行的成本进行比较。因此,列中可能有两个值price
:$2.9 和 $2.4。
高峰时间在 6:30-9:30 和 16:30-19:30 之间。必须有更好的方法来做到这一点,但现在我写了以下一组条件:
首先,我使用它as.POSIXlt
是为了可以单独使用$hour
并$min
从数据中分离出小时和分钟。
开始的数据框是data
time2 <- strptime(data$time, "%H:%M:%OS")
posixlt <- as.POSIXlt(time2, format="%d-%m-%Y %H:%M:%S")
names(unclass(posixlt))
peak <- posixlt
从peak
包含时间的新列中,我想生成一个新的 data.frame,其中包含原始数据和一个单独的小时和分钟列。
df <-cbind(data,peak$hour, peak$min)
as.numeric(peak$hour)
as.numeric(peak$min)
现在我设置我的条件来考虑不同的时间可能性和df$price
列中的相应价格。
df$price[peak$hour <6] <- 2.4
df$price[((peak$hour >= 6) & (peak$hour <=9))] <- 2.9
df$price[peak$hour==9 & peak$min >=30] <- 2.4
df$price[peak$hour>9 & peak$hour <=16] <- 2.4
df$price[peak$hour==16 & peak$min >=30] <- 2.9
df$price[peak$hour>16 & peak$hour<19] <- 2.9
df$price[peak$hour>19] <- 2.4
df$price[peak$hour==19 & peak$min <=30] <- 2.9
df$price[peak$hour==19 & peak$min >=30] <- 2.4
它起作用了,但是必须有一种我忽略的更有效的方法吗?也许我不需要对时间列做所有的准备工作,我很想知道还有哪些其他选项可供将来参考。