Вопрос по r, date, time, time-series – @Erica: Это уже совсем другое. На самом деле это гораздо более выполнимо, чем ваш первоначальный вопрос. Если вы адаптируете вопрос, я проверю, что смогу найти.

0

читал предыдущий пост, но я не могу получить то, что я хочу. Мне нужно получить серию с 16 интервалами в день (по крайней мере, первый и последний день, в этих случаях интервалы начинаются / заканчиваются первым / последним наблюдением). Мне бы хотелось, чтобы наблюдаемые переменные находились в соответствующем интервале, а NA - в противном случае.

Мои данные выглядят следующим образом: [Ya и Yb - наблюдаемые переменные]

mdyhms                  Ya  Yb
Mar-27-2009 19:56:47    25  58.25
Mar-27-2009 20:38:59    9   81.25
Mar-28-2009 08:00:30    9   88.75
Mar-28-2009 09:26:29    0   89.25
Mar-28-2009 11:57:01    8.5 74.25
Mar-28-2009 12:19:10    7.5 71.00
Mar-28-2009 14:17:05    1.5 70.00
Mar-28-2009 15:13:14    NA  NA
Mar-28-2009 17:09:53    4   85.50
Mar-28-2009 18:37:24    0   86.00
Mar-28-2009 19:19:23    0   50.50
Mar-28-2009 20:45:50    0   36.25
Mar-29-2009 08:44:16    4.5 34.50
Mar-29-2009 10:35:12    8.5 39.50
Mar-29-2009 11:09:13    3.67    69.00
Mar-29-2009 12:40:07    0   54.25
Mar-29-2009 14:31:48    5.33    35.75
Mar-29-2009 16:19:27    6.33    71.75
Mar-29-2009 16:43:20    7.5 64.75
Mar-29-2009 18:37:42    8   83.75
Mar-29-2009 20:01:26    6.17    93.75
Mar-29-2009 20:43:53    NA  NA
Mar-30-2009 08:42:05    12.67   88.50
Mar-30-2009 09:52:57    4.33    75.50
Mar-30-2009 12:01:32    1.83    70.75
Mar-30-2009 12:19:40    NA  NA
Mar-30-2009 14:23:37    3.83    86.75
Mar-30-2009 16:00:59    37.33   80.25
Mar-30-2009 17:19:28    10.17   77.75
Mar-30-2009 17:49:12    9.83    73.00
Mar-30-2009 20:06:00    11.17   76.75
Mar-30-2009 21:40:35    20.33   68.25
Mar-31-2009 08:11:12    18.33   69.75
Mar-31-2009 09:51:29    14.5    65.50
Mar-31-2009 11:10:41    NA  NA
Mar-31-2009 13:27:09    NA  NA
Mar-31-2009 13:44:35    NA  NA
Mar-31-2009 16:01:23    NA  NA
Mar-31-2009 16:56:14    NA  NA
Mar-31-2009 18:27:28    NA  NA
Mar-31-2009 19:17:46    NA  NA
Mar-31-2009 21:12:22    NA  NA
Apr-01-2009 08:35:24    2.33    60.25
Apr-01-2009 09:24:49    1.33    71.50
Apr-01-2009 11:28:34    5.67    62.00
Apr-01-2009 13:31:48    NA  NA
Apr-01-2009 14:52:18    NA  NA
Apr-01-2009 15:11:44    1.5 71.50
Apr-01-2009 17:00:53    3.17    84.00

Спасибо!

Спасибо Мареку за редактирование моих данных, теперь я знаю, как это сделать! Erica
Можете ли вы использоватьdput функция на вашем объекте (dput(foo) ) и скопировать вывод? Это позволяет нам легче читать данные Sacha Epskamp

Ваш Ответ

1   ответ
4

что ваш фрейм данных называется «Данные», я бы использовалпакет хтс, С ними намного проще работать:

#Conversion of dates
Data$time <- as.POSIXct(Data$mdyhms,format="%b-%d-%Y %H:%M:%S")

#conversion to time series
library(xts)
TimeSeries <- xts(Data[,c("Ya","Yb")],Data[,"time"])

Тогда TimeSeries можно будет использовать впоследствии. Вы не можете использовать нормальный тс, потому что у вас нет регулярных временных рядов. Ни в коем случае вы не можете защитить, что интервалы времени между вашими наблюдениями равны.

РЕДАКТИРОВАТЬ :

Что касается ваших замечаний в комментариях, вы можете попробовать следующее:

#Calculate the period they're into
#This is based on GMT and the fact that POSIXct gives the number of seconds
#passed since the origin. 5400 is 1/16 of 86400 seconds in a day

Data$mdyhms <- as.POSIXct(Data$mdyhms,format="%b-%d-%Y %H:%M:%S",tz="GMT")
Data$Period <- as.numeric(Data$mdyhms) %/% 5400 * 5400

#Make a new data frame with all periods in the range of the dataframe

Date <- as.numeric(trunc(Data$mdyhms,"day"))
nData <- data.frame(
    Period = seq(min(Date),max(Date)+86399,by=5400)
)
# Merge both dataframes and take the mean of values within a dataframe

nData <- merge(Data[c('Ya','Yb','Period')],nData,by="Period",all=T)
nData <- ddply(nData,"Period",mean,na.rm=T)

#Make the time series and get rid of the NaN values
#These come from averaging vectors with only NA
TS <- ts(nData[c('Ya','Yb')],frequency=16)
TS[is.nan(TS)] <- NA
@Erica: даже если бы вы определили интервалы и поместили каждый момент времени в интервал, которому он принадлежит, некоторые интервалы все равно получают 2 точки данных. Следовательно, нет никакого способа сделать это. Joris Meys
@Erica: Это уже совсем другое. На самом деле это гораздо более выполнимо, чем ваш первоначальный вопрос. Если вы адаптируете вопрос, я проверю, что смогу найти. Joris Meys
@Erica: Учитывая временные точки в ваших данных выборки, невозможно определить, где именно должны быть заполнены дополнительные наблюдения NA. Каждое наблюдение находится в другой момент времени, и между ними нет согласованности в интервалах. Так что нет автоматического способа сделать это. Что касается ошибки: я попробовал ее с вашими примерами данных, и она отлично работала. Убедитесь, что mdyhms является символьной строкой, которая везде одинаково отформатирована по всей переменной, и не забудьте сначала преобразовать ее в POSIXct. Joris Meys
@Joris Meys: Как вы указали, некоторые интервалы дают 2 наблюдения. Моя идея состояла в том, чтобы определить интервалы и найти наблюдаемые переменные в соответствующем интервале. И когда 2 наблюдения находятся в одном и том же интервале, рассмотрите СРЕДСТВО. Я пробовал несколько форм, но мне не удалось это сделать. Я думаю, мне придется сделать это вручную. В любом случае, спасибо за вашу помощь! Erica
@Joris Meys Joris, я согласен с вами в отношении характеристик этих наблюдений. Помимо этого, я хотел бы, чтобы наблюдаемые переменные находились в соответствующем интервале (16 по дням), а в противном случае - NA (это моя ЦЕЛЬ). С другой стороны, когда я применяю ваше предложение, я получаю эту ошибку: символьная строка не имеет стандартного однозначного формата. Спасибо! Erica

Похожие вопросы