Создание оператора switch - PullRequest
0 голосов
/ 26 июля 2010

Недавно мне нужно было преобразовать серию дат из формы "July 25, 2010" в стандартный формат R "2010-07-25":

> head(old.data$dateoccurred)`
[1] "April 9, 2004"     "September 1, 2004" "February 7, 2005

Чтобы решить эту проблему, я хотел бы сделать оператор переключения в 12 случаях, который возвращает числовое представление месяца; однако R не поддерживает собственный переключатель (по крайней мере, я не смог его найти).

Как таковой, какой самый R-подобный способ создания коммутатора?

Ответы [ 2 ]

5 голосов
/ 26 июля 2010

DrewConway приятно отвечает на вопрос о переключателе. Основной вопрос о дате имеет функции специально для него. strptime () преобразует строку в стандартный объект времени, который вы можете отформатировать как угодно.

strptime("September 1, 2004", "%B %d, %Y")

[1] "2004-09-01"

(конечно, строковую константу в вышеприведенном выражении можно заменить вашим вектором строк)

1 голос
/ 26 июля 2010

Этот ответ основан на использовании dict в Python для поведения переключения репликации . Вместо того, чтобы иметь собственный переключатель, создайте list, который проиндексирован по названиям месяцев со значениями для числового эквивалента:

months<-list("January"="01","February"="02","March"="03","April"="04","May"="05","June"="06","July"="07","August"="08","September"="09","October"="10","November"="11","December"="12")

С этим списком просто использовать sapply для создания преобразования:

new.dates<-sapply(as.character(old.data$dateoccurred),function(x) paste(strsplit(x," ")[[1]][3],month.convert(strsplit(x," ")[[1]][1]),sub(",","",strsplit(x," ")[[1]][2]),sep="-"))

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

head(new.data$dateoccurred)
[1] 2004-04-09 2004-09-01 2005-02-07 2005-02-19 2005-02-22 2005-03-11
264 Levels: 2004-04-09 2004-09-01 2005-02-07 2005-02-19 2005-02-22 2005-03-11 2005-03-15 2005-03-19 2005-05-13 2005-06-28 2005-06-29 2005-07-05 ... 2009-12-22
...