Группировка значений в Кронштейны

Обновить

December 2018

Просмотры

501 раз

2

У меня есть вопрос о группировке данных по определенным категориям.

Как правило, если у меня есть переменная фактор, я бы выполнить что-то, как показано ниже, чтобы ковш / перекодировать данные в предпочтительном схеме:

educ = NA
educ[educ2 %in% levels(educ2)[c(5,8)]] <- "HS or Some College"
educ[educ2 %in% levels(educ2)[2:3]] <- "College Degree"
educ[educ2 %in% levels(educ2)[c(4,6)]] <- "Advanced Degree" 
educ[educ2 %in% levels(educ2)[c(1,7,9)]] <- NA
educ = factor(educ)

Тем не менее, я не борюсь с попыток перегруппироваться переменным фактор, время, которое имеет 10000 + уровней. Данные структурированы следующим образом:

> levels(wj$time)
    [1] "0:00:05"  "0:00:07"  "0:00:08"  "0:00:10"  "0:00:13"  "0:00:15"  "0:00:18"  "0:00:23"  "0:00:31"  "0:00:34"  "0:00:36" 
   [12] "0:00:39"  "0:00:41"  "0:00:47"  "0:00:48"  "0:00:54"  "0:00:55"  "0:00:56"  "0:00:59"  "0:01:01"  "0:01:02"  "0:01:03" 
   [23] "0:01:13"  "0:01:17"  "0:01:31"  "0:01:33"  "0:01:41"  "0:01:44"  "0:01:48"  "0:01:50"  "0:01:52"  "0:01:53"  "0:01:55" 
   [34] "0:02:08"  "0:02:12"  "0:02:13"  "0:02:21"  "0:02:26"  "0:02:27"  "0:02:30"  "0:02:32"  "0:02:33"  "0:02:36"  "0:02:37" 
   [45] "0:02:38"  "0:02:43"  "0:02:45"  "0:02:53"  "0:02:56"  "0:03:07"  "0:03:15"  "0:03:19"  "0:03:21"  "0:03:22"  "0:03:24" 
   [56] "0:03:30"  "0:03:36"  "0:03:39"  "0:03:41"  "0:03:49"  "0:03:56"  "0:03:59"  "0:04:02"  "0:04:04"  "0:04:07"  "0:04:10" 
   [67] "0:04:11"  "0:04:12"  "0:04:14"  "0:04:16"  "0:04:17"  "0:04:19"  "0:04:22"  "0:04:27"  "0:04:28"  "0:04:30"  "0:04:37" 
   [78] "0:04:39"  "0:04:41"  "0:04:49"  "0:04:51"  "0:04:52"  "0:04:53"  "0:04:54"  "0:05:05"  "0:05:06"  "0:05:20"  "0:05:22" 

Я просто не знаю , как быстро ведро данных в определенные скобки , когда есть так много уровней факторов. Я хотел бы, чтобы сгруппировать их в возможно 0:12:00 to 0:05:00и 0:05:01 to 0:10:00так далее. С таким большим количеством уровней факторов, просто я немного потерял о том , как определить , когда начало и конец bucketing. Кто может предоставить любую помощь? С 10000 + ведрами, это становится проблемой , с тем, как я традиционно делать.

Спасибо!

3 ответы

1

Проблема вы работаете в том , что у вас есть фактически непрерывную переменную, которую расположили в определенном символьном формате , который хранится в качестве фактора. Фактор не очень уместно , так как уровни просто представляют собой то , что значения случиться , чтобы присутствовать в ваших данных , а не заранее определенного набора возможных значений. Тот факт , что это вектор символ , потому , что представляет собой особую конвенцию в форматировании типа данных, а именно раз. Я бы предположил , что это было часы: минуты: секунды, но , учитывая ваш пример ломает это может быть дней (?): Часы: минуты. Если часы: минуты: секунды, то было бы лучше , чтобы представить эти времена как timesобъект отchronпакет. Если вы сделаете это, то проблема становится , как классифицировать непрерывную переменную в дискретные группы. Это делается с помощью cutфункции.

4

Вы можете разделить метку времени на ее компоненты: ведра затем очень легко вычислить.

# Sample data
n <- 10
d <- data.frame(
  time = paste( 
    sample(0:23, n, replace=TRUE), 
    sample(0:59, n, replace=TRUE), 
    sample(0:59, n, replace=TRUE), 
    sep=":" 
  ),
  value = rnorm(n)
)

# Split the "time" column into its components
d$time <- as.character( d$time )
times <- strsplit( d$time, ":" )
times <- lapply( times, as.numeric )
times <- do.call(rbind, times)
colnames(times) <- c("hour", "minute", "second")
d <- cbind(times, d)

# Build the buckets
d$bucket <- paste(
  sprintf( "%02d:%02d:00", d$hour, floor( d$minute / 5 ) * 5 ),
  sprintf( "%02d:%02d:59", d$hour, floor( d$minute / 5 ) * 5 + 4 ),
  sep=" to "
)
0

Объединение ответов / код из @ Брайан Diggs & @Vincent Zoonekynd, я рекомендовал бы несколько функций:

?strptime
?POSIXlt
?cut.POSIXt


#create factorized time vector within data frame
n <- 10
d <- data.frame(
  time =  as.factor(paste( 
    sample(0:23, n, replace=TRUE), 
    sample(0:59, n, replace=TRUE), 
    sample(0:59, n, replace=TRUE), 
    sep=":" 
  )),
  value = rnorm(n)
)

#convert to time format, then apply cuts per hour
(d$time<- cut.POSIXt(strptime(d$time, format="%H:%M:%S"), breaks="hour"))

Если вы не хотите почасовой перерывы , которые можно использовать «день» или что - то другое. Кроме того, вы можете проверить нашу эту ссылку для ответа на ваш вопрос, который я нашел, ища «преобразовать строку время.»

НТН.