R - dplyr mutate с функцией проверяет только первый ряд
У меня есть список раз, и я хочу поместить их в ведра. то есть "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))
Что я обнаружил, так это то, что, поскольку первая строка имела начальное время "12:30", функция заполняла столбец Time.Bucket исключительно "12:00 - 16:30". Как я могу изменить, чтобы применить свою функцию к каждой строке индивидуально, вместо того, чтобы применить ее один раз к первой строке и скопировать результат для остальных?
2 ответа
Решение
Пытаться:
bucket.start.time =function(m){
x=c("7:00 AM","12:00 PM","4:31 PM","7:00 PM","11:59 PM")
x=strptime(x,format = "%I:%M %p")
y=c("7:00 AM - 11:59 AM","12:00 PM - 4:30 PM",
"4:31 PM - 6:59 PM","7:00 PM - 12:00 AM")
cut(strptime(m,format = "%I:%M %p"),x,y)
}
mutate(Appointments, Time.Bucket = bucket.start.time(Start.Time))
Я не думаю, что это лучший ответ, но я думаю, что самое важное для меня было вывести вектор. Я использовал цикл for, чтобы изменить мою функцию:
bucket.start.time2 <- function(x) {
totalbuckets <- vector(mode="character", length=length(x))
for (i in 1:length(x)) {
if (strptime(x[i], format = "%I:%M %p") >= strptime("7:00", format = "%R") &&
strptime(x[i], format = "%I:%M %p") < strptime("12:00", format = "%R")) {
timebucket <- "7:00 AM - 11:59 AM"
}
if (strptime(x[i], format = "%I:%M %p") >= strptime("12:00", format = "%R") &&
strptime(x[i], format = "%I:%M %p") <= strptime("16:30", format = "%R")) {
timebucket <- "12:00 PM - 4:30 PM"
}
if (strptime(x[i], format = "%I:%M %p") > strptime("16:30", format = "%R") &&
strptime(x[i], format = "%I:%M %p") < strptime("19:00", format = "%R")) {
timebucket <- "4:31 PM - 6:59 PM"
}
if (strptime(x[i], format = "%I:%M %p") >= strptime("19:00", format = "%R") &&
strptime(x[i], format = "%I:%M %p") < strptime("24:00", format = "%R")) {
timebucket <- "7:00 PM - 12:00 AM"
}
totalbuckets[i] <- timebucket
}
return(totalbuckets)
}
Теперь это работает в следующем утверждении:
mutate(Appointments, Time.Bucket = bucket.start.time(Start.Time))