因子の順序付けに関する投稿をいくつか見てきましたが、私の問題に一致するものは見つかりませんでした。残念ながら、私の R に関する知識はまだかなり初歩的です。
私は、考古学的遺物カタログのサブセットを扱っています。診断用の歴史的遺物の種類と現場のテスト場所をクロス集計しようとしています。ddply または tapply を使えば簡単です。
私の問題は、アーティファクト タイプ (要因) を平均診断日 (番号/年) で並べ替えたいのですが、アルファベット順に表示されてしまうことです。順序付けされた要因にする必要があることはわかっていますが、他の列の年の値で並べ替える方法がわかりません。
IDENTIFY MIDDATE
engine-turned fine red stoneware 1769
white salt-glazed stoneware, scratch blue 1760
wrought nail, 'L' head 1760
yellow lead-glazed buff earthenware 1732
...
注文する必要があるもの:
IDENTIFY MIDDATE
yellow lead-glazed buff earthenware 1732
white salt-glazed stoneware, scratch blue 1760
wrought nail, 'L' head 1760
engine-turned fine red stoneware 1769
...
要素(IDENTIFY)は日付(MIDDATE)で順序付けする必要があります。
Catalog$IDENTIFY<-factor(Catalog$IDENTIFY,levels=Catalog$MIDDATE,ordered=TRUE)
しかし、警告が表示されます:
In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels)
else paste0(labels,: duplicated levels will not be allowed
in factors anymore
IDENTIFY には約 130 個の因子レベルがあり、その多くが MIDDATE に対して同じ値を持っているため、IDENTIFY を MIDDATE と別の列 TYPENAME で並べ替える必要があります。
もう少し詳しく説明します:
データフレーム がありCatalog
、次str(Catalog)
のように分類されます。
> str(Catalog)
'data.frame': 2211 obs. of 15 variables:
$ TRENCH : Factor w/ 7 levels "DRT 1","DRT 2",..: 1 1 1 1 1 1 1 1 1 1 ...
$ U_TYPE : Factor w/ 3 levels "EU","INC","STP": 1 1 1 1 1 1 1 1 1 1 ...
$ U_LBL : Factor w/ 165 levels "001","005","007",..: 72 72 72 72 72 72 ...
$ L_STRAT : Factor w/ 217 levels "#2-7/25","[3]",..: 4 4 4 4 4 4 89 89 89 89 ...
$ START : num 0 0 0 0 0 0 39.4 39.4 39.4 39.4 ...
$ END : num 39.4 39.4 39.4 39.4 39.4 39.4 43.2 43.2 43.2 43.2 ...
$ Qty : int 1 1 3 5 1 1 6 8 1 1 ...
$ MATNAME : Factor w/ 6 levels "Ceramics","Chipped Stone",..: 1 1 1 5 5 6 ...
$ TYPENAME: Factor w/ 9 levels "Architectural Hardware",..: 9 9 9 1 1 3 9 ...
$ CATNAME : Factor w/ 32 levels "Biface","Bottle Glass",..: 24 29 29 6 24 ...
$ IDENTIFY: Factor w/ 112 levels "amethyst bottle glass",..: 17 91 96 71 103 ...
$ BEGDATE : int 1820 1820 1830 1835 1700 NA 1670 1762 1800 1720 ...
$ ENDDATE : int 1900 1970 1860 1875 1820 NA 1795 1820 1820 1780 ...
$ OCC_LBL : Ord.factor w/ 5 levels "Late 19th Century"<..: 2 1 2 2 4 5 4 3 ...
$ MIDDATE : num 1860 1895 1845 1855 1760 ...
IDENTIFY
順序付けられた因子を作成し、MIDDATE
-> TYPENAME
-> alpha byで並べ替える必要がありますIDENTIFY
。
実際に理解していないのは、複数の列からの結合された順序で並べ替える方法です。
私はこれをデータベース内で実行するだけですが、私が実行しているものの多くは、あらゆる種類のクロス集計内の加重平均です (例: 場所別の遺物クラスの地表下の加重平均深度)...
...Access でも実行できますが、面倒で予測できません。R で管理する方がはるかに簡単でクリーンですが、結果のテーブルを手動で再並べ替えるのは避けたいです。
私が作ろうとしているのは、次のようなものです:
>xtab.Catalog<-tapply(Catalog$Qty,list(Catalog$IDENTIFY,Catalog$TRENCH),sum)
IDENTIFY DRT1 DRT2 DRT3 DRT4 DRT5 DRT6
Staffordshire stoneware 4 NA NA NA NA NA
undecorated delftware 6 4 NA NA NA NA
unidentified wrought nail 15 9 3 1 3 NA
white salt-glazed stoneware 6 1 1 NA 2 1
white salt-glazed scratch blue 1 NA NA NA NA NA
white stoneware, slip-dipped NA NA NA NA NA NA
wrought nail, 'L' head 2 NA NA NA NA NA
wrought nail, 'rose' head 62 21 4 NA 1 1
wrought nail, 'T' head 2 NA 1 NA NA 1
yellow lead-glazed 12 NA NA NA 1 3
...
...ただし、アルファベット順ではなく論理的順序(つまり、時系列/タイプ順)で並べ替える必要があります。
ベストアンサー1
再現可能なサンプルと解決策を以下に示します。
set.seed(0)
a = sample(1:20,replace=F)
b = sample(1:20,replace=F)
f = as.factor(letters[1:20])
> a
[1] 18 6 7 10 15 4 13 14 8 20 1 2 9 5 3 16 12 19 11 17
> b
[1] 16 18 4 12 3 5 6 1 15 10 19 17 9 11 2 8 20 7 13 14
> f
[1] a b c d e f g h i j k l m n o p q r s t
Levels: a b c d e f g h i j k l m n o p q r s t
さて、新しい要素について:
fn = factor(f, levels=unique(f[order(a,b,f)]), ordered=TRUE)
> fn
[1] a b c d e f g h i j k l m n o p q r s t
20 Levels: k < l < o < f < n < b < c < i < m < d < s < q < g < h < e < ... < j
'a'、次に 'b'、最後に 'f' 自体でソートされます (ただし、この例では 'a' には重複した値はありません)。