Группировка значений в скобках - PullRequest
2 голосов
/ 12 января 2012

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

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

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)

Однако я пытаюсь перегруппировать факторную переменную, TIME, которая имеет более 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 и так далее. С таким количеством уровней факторов я просто немного растерялся, как определить, когда начинать и заканчивать группирование. Кто-нибудь может помочь? С 10 000 + ведрами это становится проблемой с тем, как я традиционно делаю вещи.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 12 января 2012

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

# 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 "
)
1 голос
/ 12 января 2012

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

0 голосов
/ 19 февраля 2013

Объединяя ответы / код от @Brian 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"))

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

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...