2016-12-15 4 views
-1

Я хотел бы подмножить следующий файл csv на основе дат Pentad (не совпадающих средних дат). Например:Подмножество данных csv на основе дат Pentad с использованием R

1.January 1 to January 5 
2.January 6 to January 10 
... 
73.December 27 to December 31. 

Вот полный список дат пентадных:

List of Pentad dates

The Complete Data

Примеры данных

SN,CY,Y,M,D,H,lat,lon,cat 
198305,5,1983,8,5,0,9.1,140.7,"TD" 
198305,5,1983,8,5,6,9.3,140.5,"TD" 
198305,5,1983,8,5,12,9.6,139.9,"TD" 
198305,5,1983,8,5,18,9.9,139.4,"TS" 
198305,5,1983,8,6,0,10.2,138.8,"TS" 
198305,5,1983,8,6,6,11,138.1,"TS" 
198305,5,1983,8,6,12,11.8,137.3,"TS" 
198305,5,1983,8,6,18,12.4,136.4,"Cat1" 
198305,5,1983,8,7,0,12.8,135.8,"Cat1" 
198305,5,1983,8,7,6,13.6,134.7,"Cat1" 
198305,5,1983,8,7,12,14.4,133.9,"Cat2" 
198305,5,1983,8,7,18,15,133.5,"Cat4" 
198305,5,1983,8,8,0,15.8,132.8,"Cat4" 
198305,5,1983,8,8,6,16.3,132.4,"Cat4" 
198305,5,1983,8,8,12,17.1,132,"Cat5" 
198305,5,1983,8,8,18,17.4,131.4,"Cat5" 
198305,5,1983,8,9,0,17.8,130.8,"Cat5" 
198305,5,1983,8,9,6,18.1,130.7,"Cat4" 
198305,5,1983,8,9,12,18.7,130.3,"Cat4" 
198305,5,1983,8,9,18,18.9,130.4,"Cat4 

SN является уникальным идентификатором, Y является лет , M - месяцы, D - дни, H - часы. Если уникальный номер попадает в один пентад, его больше не следует включать в следующее подмножество.

Я попытался это за август (на основе из предыдущего поста):

P1 <- c(1,6,11,16,21,26) 
P6 <- c(5,10,15,20,25,30) 
res <- Map(function(x,y) subset(df1, M==8 & D >=x & D <= y), d1, d2) 

Но у меня проблема с отображением с исходными пятерками (Р7), потому что она включает в себя 31 января по 4 февраля

Может ли кто-нибудь предложить какие-либо методы для этого в R? Поймите любую помощь.

ответ

0
library(stringr) 
df$Date = paste(df$Y, str_pad(df$M,2,'left','0'), str_pad(df$D,2,'left','0'), sep='-') 
# Extract day of year (int 0 to 365) from POSIXlt date 
df$yday = as.POSIXlt(df$Date)$yday + 1 

Теперь это тривиальное:

df$pentad = ceiling(df$yday/5) 
+0

Я попробовал это, но я не уверен, если это правильный путь, или есть еще более простой способ, чем это (образец для августу до SEP). Я воспользовался «днем года» из вашего кода. Что делает последняя строка df $ pentad? d1 <-c (216,221,226,231,236,241,246,251,256,261,266) d2 <-c (220,225,230,235,240,245,250,255,260,265,270) res <- Карта (функция (x, y) подмножество (df, yday> = x & yday <= y), d1, d2) lapply (res, head , 2) – ichabod

+0

Чтобы получить подмножества, просто разделите (df, df $ pentad) '. Это дает вам список фреймов данных, каждый из которых соответствует пентаде. – sirallen

+0

Wow.Amazing !. Большое спасибо за помощь! – ichabod