Используя ваш пример dataframe, мы могли бы:
xtabs(value ~ name + numbers, data = dat1)
Здесь есть два шага:
blockquote>X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")
Теперь столбец
newdate
должен иметь типDate
.
- Отформатируйте данные. Это вопрос вызова
format()
илиstrftime()
:blockquote>format(X$newdate, "%Y-%m-%d")
Более полный пример:
R> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), + mid=c(0.8378,0.8457,0.8147)) R> nzd date mid 1 31/08/2011 0.8378 2 31/07/2011 0.8457 3 30/06/2011 0.8147 R> nzd$newdate <- strptime(as.character(nzd$date), "%d/%m/%Y") R> nzd$txtdate <- format(nzd$newdate, "%Y-%m-%d") R> nzd date mid newdate txtdate 1 31/08/2011 0.8378 2011-08-31 2011-08-31 2 31/07/2011 0.8457 2011-07-31 2011-07-31 3 30/06/2011 0.8147 2011-06-30 2011-06-30 R>
Разница между столбцами три и четыре - это тип:
newdate
имеет классDate
, тогда какtxtdate
является символом.
Вы также можете использовать функцию parse_date_time
из пакета lubridate
:
library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"
parse_date_time
возвращает объект POSIXct, поэтому мы используем as.Date
для получения объекта даты. Первый аргумент parse_date_time
указывает вектор даты, второй аргумент определяет порядок, в котором происходит ваш формат. Аргумент orders
делает parse_date_time
очень гибким.
После чтения ваших данных через textConnection
, похоже, работает следующее:
dat <- read.table(textConnection(txt), header = TRUE)
dat$date <- strptime(dat$date, format= "%d/%m/%Y")
format(dat$date, format="%Y-%m-%d")
> format(dat$date, format="%Y-%m-%d")
[1] "2011-08-31" "2011-07-31" "2011-06-30" "2011-05-31" "2011-04-30" "2011-03-31"
[7] "2011-02-28" "2011-01-31" "2010-12-31" "2010-11-30" "2010-10-31" "2010-09-30"
[13] "2010-08-31" "2010-07-31" "2010-06-30" "2010-05-31" "2010-04-30" "2010-03-31"
[19] "2010-02-28" "2010-01-31" "2009-12-31" "2009-11-30" "2009-10-31"
> str(dat)
'data.frame': 23 obs. of 2 variables:
$ date : POSIXlt, format: "2011-08-31" "2011-07-31" "2011-06-30" ...
$ midpoint: num 0.838 0.846 0.815 0.797 0.788 ...
as.POSIXct(otherStuffHere)
, вероятно, сработает. Спасибо за эту ссылку, я не знал о тех проблемах, которые поднимал Хэдли.
– Chase
17 September 2011 в 13:48
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
В приведенном выше фрагменте кода есть две ошибки. Прежде всего, когда вы читаете nzd$date
внутри as.Date
, вы не указываете, в каком формате вы его подаете date
. Таким образом, он пытается установить формат по умолчанию для его чтения. Если вы видите документ help
, ?as.Date
, вы увидите
format. Символьная строка. Если не указано, он попытается «% Y-% m-% d», а затем «% Y /% m /% d» на первом элементе, отличном от NA, и сообщите об ошибке, если они не работают. В противном случае обработка выполняется через strptime
blockquote>. Вторая ошибка: даже если вы хотели бы прочитать ее в формате
%Y-%m-%d
, внутриformat
вы написали"%Y/%m/%d"
.Теперь правильный способ сделать это:
> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), + mid=c(0.8378,0.8457,0.8147)) > nzd date mid 1 31/08/2011 0.8378 2 31/07/2011 0.8457 3 30/06/2011 0.8147 > nzd$date <- format(as.Date(nzd$date, format = "%d/%m/%Y"), "%Y-%m-%d") > head(nzd) date mid 1 2011-08-31 0.8378 2 2011-07-31 0.8457 3 2011-06-30 0.8147
Я считаю, что
nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")
является достаточным.
Это очень просто, используя пакет lubridate. Все, что вам нужно сделать, это указать R, в каком формате уже установлена дата. Затем он преобразует его в стандартный формат
nzd$date <- dmy(nzd$date)
, вот и все.
str(x)
между каждой строкой, чтобы вы могли видеть различия в действии. – Chase 16 September 2011 в 12:53