2017-02-25 5 views
0

データフレームのリストがあり、year.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" 

だから私は、すなわち月から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

動物園のパッケージができるように、実際に数値で、「yearmon'-分類値を返すas.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="") 
関連する問題