Преобразовать столбец времени в символьном формате в управляемый формат времени в R - PullRequest
0 голосов
/ 27 мая 2018

Мой вопрос касается стандартизации столбца b.Мне нужно, чтобы эти данные были в формате, который облегчает построение графики.

a<- c("Jackson Brice / The Shocker","Flash Thompson", "Mr. Harrington","Mac Gargan","Betty Brant", "Ann Marie Hoag","Steve Rogers / Captain America", "Pepper Potts", "Karen") 
b<- c("2:30", "2:15", "2", "1:15", "1:15", "1", ":55",":45", "v")

ab <- cbind.data.frame(a,b)

                               a    b
1    Jackson Brice / The Shocker 2:30
2                 Flash Thompson 2:15
3                 Mr. Harrington    2
4                     Mac Gargan 1:15
5                    Betty Brant 1:15
6                 Ann Marie Hoag    1
7 Steve Rogers / Captain America    1
8                   Pepper Potts  :45
9                          Karen    v

как результат:

                            a        b
1    Jackson Brice / The Shocker 00:02:30
2                 Flash Thompson 00:02:15
3                 Mr. Harrington 00:02:00
4                     Mac Gargan 00:01:15
5                    Betty Brant 00:01:15
6                 Ann Marie Hoag 00:01:00
7 Steve Rogers / Captain America 00:01:00
8                   Pepper Potts 00:00:45
9                          Karen 00:00:00

Если возможно, объекты столбца b в манипуляцияхформат времени.

Ответы [ 2 ]

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

Итак, мне пришлось сделать несколько предположений о том, что вы пытаетесь сделать, например, о единицах измерения и о том, что вы хотите сделать со значениями символов, но, надеюсь, эта функция даст вам что-то для работы.

Большая проблема со временем заключается в том, что вам нужно несколько довольно четких правил при анализе текста.По мере того, как я получал результаты, мне пришлось добавить несколько if операторов в функцию, чтобы она работала, но, где это возможно, старайтесь сохранять ваши форматы времени как можно более согласованными.

library(lubridate)

formatTime <- function(x) {

    # Check for a : seperator in the text
    if(grepl(":",x, fixed = TRUE)) {

        y <- unlist(strsplit(x,":", fixed = TRUE))

        # If there is no value before the : then add "00" before the :
        if(y[1]=="") {
            z <- ms(paste("00",y[2],collapse = ":"), quiet=TRUE)
        } else {
            z <- ms(paste(y,collapse = ":"), quiet=TRUE)
        }
    } else { 

        # If there is no : then add "00" after the :
        z <- ms(paste(x,"00",collapse = ":"), quiet=TRUE)
    }

    # If it did not pare with ms, i.e. it was a character, then assign zero time "00:00"
    if(is.na(z)) z <- ms("0:00")

    # Converted to duration due to issues returning period with lapply.  
    # Make dataframe to retun units and name with lapply.
    return(data.frame(time = as.duration(z)))
}

# Convert factor variable to character
ab$b <- as.character(ab$b)

ab <- cbind(ab,rbindlist(lapply(ab$b,formatTime)))

Я начал с попыткиработать с периодом времени, но он не будет корректно возвращаться с оператором применения, поэтому я преобразовал в продолжительность.Это может не отображаться так же, как ваш пример, но должно хорошо работать с графиками.
Дайте мне знать, если я пропустил то, что вам нужно, и я обновлю ответ.

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

Может быть достигнуто решение с использованием tidyr::separate и tidyr::unite.Подход заключается в том, чтобы сначала заменить значение, содержащее alphabetic на 00:00:00.Отдельные части в 3 колонки.При использовании dplyr::mutate_at все 3 столбца изменяются на формат 00.Наконец, объедините все три столбца.

library(tidyverse)

ab %>% mutate_if(is.factor, as.character) %>%  #Change any factor in character
  mutate(b = ifelse(grepl("[[:alpha:]]", b), "00:00:00", b)) %>%
  mutate(b = ifelse(grepl(":", b), b, paste(b,"00",sep=":")) ) %>%
  separate(b, into = c("b1", "b2", "b3"), sep = ":", fill="left", extra = "drop") %>%
  mutate_at(vars(starts_with("b")), 
      funs(sprintf("%02d", as.numeric(ifelse(is.na(.) | . == "",0,.))))) %>%
  unite("b", starts_with("b"), sep=":")

#                                a        b
# 1    Jackson Brice / The Shocker 00:02:30
# 2                 Flash Thompson 00:02:15
# 3                 Mr. Harrington 00:02:00
# 4                     Mac Gargan 00:01:15
# 5                    Betty Brant 00:01:15
# 6                 Ann Marie Hoag 00:01:00
# 7 Steve Rogers / Captain America 00:00:55
# 8                   Pepper Potts 00:00:45
# 9                          Karen 00:00:00

Данные:

a<- c("Jackson Brice / The Shocker","Flash Thompson", "Mr. Harrington","Mac Gargan","Betty Brant",
 "Ann Marie Hoag","Steve Rogers / Captain America", "Pepper Potts", "Karen") 
b<- c("2:30", "2:15", "2", "1:15", "1:15", "1", ":55",":45", "v")

ab <- cbind.data.frame(a,b
...