R смазывать: показывать только последний элемент в новой переменной

Боюсь, еще один вопрос новичка. Я пытаюсь создать новые переменные с помощью «смазывания» и столкнулся с 3 проблемами.

Я начну с переменной «время», импортированной как фактор в формате Ч:ММ:СС или ЧЧ:ММ:СС. Я также создал «timeC» в качестве персонажа.

1. Проблема с отображением

    temp$time2 <- hms(temp$time) #take my original variable "time" and convert

Проблема: на экране отображается только секундная часть «time2», хотя «внутри» она кажется правильной:

 time2
 ----
  4

> temp$time2[1,]
[1] "7H 0M 4S"

2. Извлечение часов Выпуск

     temp$hour <- hour(temp$time2) #extract just the hours portion

Проблема: это работает с перебоями; иногда все в порядке, иногда я получаю следующую ошибку:

Error in as.POSIXlt.character(as.character(x), ...) : 
   character string is not in a standard unambiguous format

Это касается меня, потому что это не похоже на то, что смазка должна выдавать сообщение.

3. Извлечение часов и минут Выдача

temp$hourMins <- hm(temp$time2)

Проблема: каждое значение hourMins равно "NA"

Я, вероятно, потратил более 4 часов, пытаясь понять это, и мне интересно, есть ли другой пакет, который может поддерживать то, что я пытаюсь сделать.

Любой совет был бы очень признателен. Заранее спасибо и с уважением!


person user2621147    schedule 09.02.2014    source источник
comment
Я думаю, вы путаете синтаксический анализ строки во времени (т.е. hms() и hm()) с извлечением компонентов из этого времени (hours(), minutes(), seconds())   -  person hadley    schedule 10.02.2014
comment
@hadley - ты совершенно прав (как и ты); все еще осваиваю документацию R: полная, но иногда трудно сказать, что важно, а что находится под капотом / не важно для повседневного использования.   -  person user2621147    schedule 12.02.2014


Ответы (1)


Сначала сделайте "игрушку" данных для иллюстрации,

require(lubridate)
temp <- data.frame(time=factor(c("01:01:01","02:02:02","03:03:03")))
temp$time2 <- hms(temp$time)
temp

##       time    time2
## 1 01:01:01 1H 1M 1S
## 2 02:02:02 2H 2M 2S
## 3 03:03:03 3H 3M 3S

1) Проблема с отображением

Вам нужно attach

attach(temp)
## The following objects are masked from temp (position 3):

##     time, time2

time2
## [1] "1H 1M 1S" "2H 2M 2S" "3H 3M 3S"

## detach(temp) # after final use.

В противном случае time2 является переменной, уже находящейся в среде, а не столбцом temp.

Изменить: вы можете проверить с помощью str, что именно находится в вашем time2.

str(time2)
## Formal class 'Period' [package "lubridate"] with 6 slots
##   ..@ .Data : num [1:3] 1 2 3
##   ..@ year  : num [1:3] 0 0 0
##   ..@ month : num [1:3] 0 0 0
##   ..@ day   : num [1:3] 0 0 0
##   ..@ hour  : num [1:3] 1 2 3
##   ..@ minute: num [1:3] 1 2 3

Если ваш time2 имеет аналогичную структуру, но при вводе time2 отображается только часть «секунды», это означает, что ваша функция печати для этого типа объектов была переопределена случайно.

2) Извлечение часов Проблема

temp$hour <- hour(temp$time2)

Без проблем

3) Извлечение часов и минут

time3 <- gsub("^(.+):[^:]+$","\\1",as.character(temp$time))
time3
## [1] "01:01" "02:02" "03:03"

hm(time3)
## [1] "1H 1M 0S" "2H 2M 0S" "3H 3M 0S"

Или используйте {hms} напрямую, чтобы включить секунды,

hms(temp$time)
## [1] "1H 1M 1S" "2H 2M 2S" "3H 3M 3S"
person xb.    schedule 09.02.2014
comment
Привет, @xb. - Спасибо за быстрый ответ. Хорошие новости: когда я попробую ваш код для 1) следующим образом: › xb ‹- data.frame(time=factor(c(01:04:01,1:05:10, 02:06:11, 2:07) :12,03:08:13,3:09:14))) работает отлично. К сожалению, я не заставил его работать с полным кадром данных. Я также вытащил только столбец времени из полного фрейма данных и создал его как отдельный фрейм данных. У меня такая же проблема - показываются только секунды. В файле 630000 строк. Я буду продолжать работать над этим ... еще раз спасибо! - person user2621147; 10.02.2014
comment
@user2621147 user2621147, пробовали ли вы использовать str, как было предложено в моем редактировании выше? - person xb.; 10.02.2014
comment
Я также не уверен, что разделяю ваш комфорт с часовой работой только с перерывами :-) - person user2621147; 10.02.2014
comment
Нееет, не используйте присоединение. - person hadley; 10.02.2014
comment
@hadley Хотя я не фанат attach, он удобен и не наносит вреда, когда локальная среда четко определена. И я упомянул detach, когда был близок. - person xb.; 10.02.2014