2017-02-25 69 views
0

我已經得到了數據框的列表,並且我根據date.month格式的日期爲它們分配了名稱。但是,在列表本身中,數據框對象以錯誤的順序存儲。根據R中的現有模式對列表中的對象重新排序

例如像這樣:

[1] "2004.Apr" "2004.Aug" "2004.Dec" "2004.Feb" "2004.Jul" "2004.Jun" 
"2004.Mar" "2004.May" "2004.Nov" "2004.Oct" "2004.Jan" 

所以我想在列表中的對象將重新排序如下圖所示,即從1至12月模式有沒有這樣做,而不必使用的一種方式循環?

[1] "2004.Jan" "2004.Feb" "2004.Mar" "2004.Apr" "2004.May" "2004.Jun" 
"2004.Jul" "2004.Aug" "2004.Sep" "2004.Oct" "2004.Nov" "2004.Dec" 

回答

1

您可以對列表名稱和集合級別進行因子分解,但我假設您有許多不同的年份和月份組合列表。您可以使用內置的不斷month.abb得到相應的指數,見下圖:

# sample list 
byMonthList <- list()[rep(1,11)] 
names(byMonthList) <- c("2004.Apr", "2004.Aug", "2004.Dec", "2004.Feb", "2004.Jul", "2004.Jun", "2004.Mar", "2004.May", "2004.Nov", "2004.Oct", "2004.Jan") 

# split month name from year.month names using strsplit 
# extract month name using sapply 
ls_month <- sapply(strsplit(names(byMonthList), split="\\."), function(x) x[2]) 
ls_month 
# [1] "Apr" "Aug" "Dec" "Feb" "Jul" "Jun" "Mar" "May" "Nov" "Oct" "Jan" 

# use match and built in constant month.abb to get numeric value of months 
ls_month_num <- match(ls_month, month.abb) 
ls_month_num 
# [1] 4 8 12 2 7 6 3 5 11 10 1 

# Use ls_month_num to reorder your list 
byMonthList[names(byMonthList)[order(ls_month_num)]] 
# Or 
byMonthList[names(byMonthList)[order(match(sapply(strsplit(names(byMonthList), split="\\."), function(x) x[2]), month.abb))]] 
0

他們重新安排這種方式,因爲名稱被存儲爲字符向量。如果你做了一個as.factor(name_vector,levels = name_vector),那麼他們將保持正確的順序。

+0

這不回答這個問題。 as.factor函數沒有日期排序功能。 –

1

動物園封裝具有as.yearmon函數返回一個「yearmon'類化值實際上是數值,因此可以作爲索引:

inp[ order(zoo::as.yearmon(inp, format="%Y.%b"))] 

[1] "2004.Jan" "2004.Feb" "2004.Mar" "2004.Apr" "2004.May" "2004.Jun" "2004.Jul" 
[8] "2004.Aug" "2004.Oct" "2004.Nov" "2004.Dec" 

數據輸入:

inp <- scan(text='"2004.Apr" "2004.Aug" "2004.Dec" "2004.Feb" "2004.Jul" "2004.Jun" "2004.Mar" "2004.May" "2004.Nov" "2004.Oct" "2004.Jan"', what="")