2017-04-20 3 views
0

저는 한 달에 한 해씩 (2002-2016) 각 연도를 분리하는보다 효율적인 방법을 찾고 있습니다. 나는 그것을 손으로했지만, 많은 시간이 걸린다.월별 모디스리스트 파일 합계

mypath<-"D:/SNOWL" 
myras<-list.files(path=mypath,pattern = glob2rx("*.tif$"), 
        full.names = TRUE, recursive = TRUE) 

> myras 
    [1] "D:/SNOWL/MOYDSL10A1.A2002001.tif" "D:/SNOWL/MOYDSL10A1.A2002002.tif" 
    [3] "D:/SNOWL/MOYDSL10A1.A2002003.tif" "D:/SNOWL/MOYDSL10A1.A2002004.tif" 
    [5] "D:/SNOWL/MOYDSL10A1.A2002005.tif" "D:/SNOWL/MOYDSL10A1.A2002006.tif" 
    [7] "D:/SNOWL/MOYDSL10A1.A2002007.tif" "D:/SNOWL/MOYDSL10A1.A2002008.tif" 
    [9] "D:/SNOWL/MOYDSL10A1.A2002009.tif" "D:/SNOWL/MOYDSL10A1.A2002010.tif" 
    [11] "D:/SNOWL/MOYDSL10A1.A2002011.tif" "D:/SNOWL/MOYDSL10A1.A2002012.tif" 

serie<-orgTime(myras, nDays = "asIn", begin ="2002-01-01",end = "2016-12-31", pillow = 75, pos1 = 13, pos2 = 19) 
filter<-serie$inputLayerDates 

> filter 
    [1] "2002-01-01" "2002-01-02" "2002-01-03" "2002-01-04" "2002-01-05" 
    [6] "2002-01-06" "2002-01-07" "2002-01-08" "2002-01-09" "2002-01-10" 
    [11] "2002-01-11" "2002-01-12" "2002-01-13" "2002-01-14" "2002-01-15" 
    [16] "2002-01-16" "2002-01-17" "2002-01-18" "2002-01-19" "2002-01-20" 
    [21] "2002-01-21" "2002-01-22" "2002-01-23" "2002-01-24" "2002-01-25" 
    [26] "2002-01-26" "2002-01-27" "2002-01-28" "2002-01-29" "2002-01-30" 
    [31] "2002-01-31" "2002-02-01" "2002-02-02" "2002-02-03" "2002-02-04" 
    [36] "2002-02-05" "2002-02-07" "2002-02-08" "2002-02-09" "2002-02-10" 
    [41] "2002-02-11" "2002-02-12" "2002-02-13" "2002-02-14" "2002-02-15" 

답변

0

편집 :

좋아, 당신을 위해 일하고 경우의 전체 크기의 예를 시도하고 보자 :

# Here we generate filenames as returned from `list.files`: 


rm(list = ls()) 

myras <- sapply(1:5465, function(i) paste0('D:/SNOWL/MOYDSL10A1.A',sample(2000:2016,1),sample(c(paste0('00',1:9),paste0('0',10:99),100:365),1),'.tif')) 

head(myras) 


# Let's extract the timestamps 

tstmps <- regmatches(myras,regexpr('[[:digit:]]{7}',myras)) 

head(tstmps,50) 

# And now convert the timestamps to dates 

dates <- as.Date(as.numeric(substr(tstmps,5,7)) - 1, origin = paste0(substr(tstmps,1,4),"-01-01")) 

head(dates,10) 


# Last step is to sort the files by month 

#check months 
print(month.name) 

myras_byM = sapply(month.name,function(x) myras[months(dates) == x]) 

head(myras_byM$January) 
head(myras_byM$February) 
head(myras_byM$March) 
head(myras_byM$April) 
head(myras_byM$May) 
head(myras_byM$June) 
head(myras_byM$July) 
head(myras_byM$August) 
head(myras_byM$September) 
head(myras_byM$October) 
head(myras_byM$November) 
head(myras_byM$December) 


쉽게 날짜를 얻을 수 있습니다 일관된 이름 지정 규칙이있는 경우 파일 이름에서

귀하의 경우, 파일이 연중 무휴로 주문 된 것으로 보입니다. 따라서 파일 이름에서 날짜를 제거한 다음 필요에 따라 필터를 적용 할 수 있습니다. 이렇게하려면 정규식을 사용하고 있습니다. 이 경우에는 날짜와 DOY 문자열에 관심이 있습니다. 항상 7 자리 숫자 여야합니다. 따라서 해당 RE는 [[:digit:]]{7}이며, 이는 7 자리 연속을 의미합니다. regexpr은 일치 항목을 찾고 regmatches은 일치 항목을 반환합니다.

dts <- regmatches(myras,regexpr('[[:digit:]]{7}',myras)) 

그럼 당신은 당신이 필요로하는 자리를 추출 substring을 사용하여 (이 방법은 (는) 4 자리 DOY 3 다음 년간 항상 가정)과 날짜로 변환 :

dts <-as.Date(as.numeric(substr(dts,5,7)) - 1, origin = paste0(substr(dts,1,4),"-01-01")) 

그 것 귀하의 예를 들어 filter의 변수를 제공하십시오.

전체 시계열을 월별로 정렬하려면 내장형 이름이 month.name 인 sapply 또는 lapply를 사용할 수 있습니다. 기본 기능 months는 주어진 날짜를 당신에게 달의 이름을 반환합니다

myras_byMonth <- sapply(month.name,function(x) myras[months(dts) == x]) 

희망은 내가 제대로 질문을 이해하고 이것이 당신이 찾고 있던 무슨이었다.

보다도,

+0

덕분에, 처음 두 줄은 확인 작업을하지만, 세번째는 문자 (0) $ 2월 문자 (0) 날이를 던졌습니다> myras_byMonth $ 1월 $ 월 문자 (0) $ 4월 문자 (0) $ 월 문자 (0) – tmsppc

+0

흥미 롭다면, 두 번째 변수 뒤에'dts' 변수가 올바르게 보이나요? 또한 myras의 크기는 얼마입니까? 그리고 그들은 모두 같은 명명 규칙을 가지고 있습니까? – Val

+0

두 번째 변수 dts는 잘 작동하며 myras 크기는 5465이며 모든 파일의 규칙은 동일합니다. – tmsppc