【发布时间】:2018-05-06 21:39:36
【问题描述】:
我有一个时间列表,我想将它们放入存储桶中。 即“9:00 PM”进入“7:00 PM - 12:00 AM”存储桶
函数如下:
bucket.start.time <- function(x) {
if (strptime(x, format = "%I:%M %p") >= strptime("7:00", format = "%R") &&
strptime(x, format = "%I:%M %p") < strptime("12:00", format = "%R")) {
timebucket <- "7:00 AM - 11:59 AM"
}
if (strptime(x, format = "%I:%M %p") >= strptime("12:00", format = "%R") &&
strptime(x, format = "%I:%M %p") <= strptime("16:30", format = "%R")) {
timebucket <- "12:00 PM - 4:30 PM"
}
if (strptime(x, format = "%I:%M %p") > strptime("16:30", format = "%R") &&
strptime(x, format = "%I:%M %p") < strptime("19:00", format = "%R")) {
timebucket <- "4:31 PM - 6:59 PM"
}
if (strptime(x, format = "%I:%M %p") >= strptime("19:00", format = "%R") &&
strptime(x, format = "%I:%M %p") < strptime("24:00", format = "%R")) {
timebucket <- "7:00 PM - 12:00 AM"
}
return(timebucket)
}
然后我使用 mutated 创建第二列:
mutate(Appointments, Time.Bucket = bucket.start.time(Start.Time))
我发现,由于第一行的 Start.Time 为“12:30 PM”,因此该函数专门用“12:00 PM - 4:30 PM”填充了 Time.Bucket 列。我怎样才能 mutate 将我的函数单独应用于每一行,而不是将其应用于第一行并将结果复制到其余行?
【问题讨论】:
-
我认为你需要
&而不是&&。 -
谢谢@MauritsEvers,我会试试的。我通过创建一个循环并让我的函数输出一个桶值向量来修复它。如果你是对的,那你的方法比我的好很多!
-
这里绝对不需要使用
for循环。看看?base::logic。&是 vectorised 逻辑 OR 运算符,您在这里需要它。 -
你的函数没有向量化:
-
@MauritsEvers 我有点明白发生了什么。我可以使用向量化 & 将这些 if 语句应用于我的整个开始时间向量。但是我有四个不同的条件语句,所以我有点困惑如何将四个逻辑向量组合成一列。我可以使用逻辑开关吗?我还需要输出一个向量吗?