R - dplyr mutate с функцией проверяет только первый ряд - PullRequest
0 голосов
/ 07 мая 2018

У меня есть список раз, и я хочу поместить их в ведра. то есть «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 ]

0 голосов
/ 07 мая 2018

Не думаю, что это лучший ответ, но я думаю, что самое важное для меня было вывести вектор. Я использовал цикл 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))
0 голосов
/ 07 мая 2018

Попробуйте:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...