2012-05-25 2 views
17

注文要因についていくつかの投稿を見てきましたが、私の問題にはあまり合致しません。残念ながら、私のRの知識はまだかなり初歩的です。R - 1つまたは複数の他の列の値に基づいて係数を注文する

私は、作業している考古学的人工物カタログのサブセットを持っています。私は、診断的な過去の成果物のタイプとサイトのテスト場所をクロス集計しようとしています。 ddplyまたはtapplyで十分に簡単です。

私の問題は、平均診断日(数字/年)でアーティファクトタイプ(因子)をソートしたいのですが、アルファベット順に並べています。私はそれを順序付けられた要素にする必要があることを知っていますが、もう1つの列の年の値でどのように注文するかを理解することはできません。

注文する必要が
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に同じ値を持っているので、私はMIDDATEでIDENTIFY注文する必要があり、別の列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

私が本当に得意ではないのは、複数の列から複数の注文を組み合わせて並べ替える方法です。

私はdbでこれをやっていますが、私が実行していることの多くは、あらゆる種類のクロス集計(例えば、ロケーション別のアーティファクトクラスの地面下の加重平均深度)にあります。

...アクセス可能ですが、乱雑で予測不能です。 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 
... 

...しかし、私は彼らが代わりにアルファベットの論理(すなわち、時系列/タイプ)の順序でソートする必要があります。

ありがとうございました。

受賞ソリューションであることが判明:

Catalog$IDENTIFY = factor(Catalog$IDENTIFY, levels = 
+ Catalog$IDENTIFY[order(Catalog$MIDDATE, Catalog$MATNAME, 
+ Catalog$TYPENAME, Catalog$CATNAME, Catalog$IDENTIFY)], ordered=TRUE) 

Catalog$IDENTIFY <- factor(Catalog$IDENTIFY[,drop=TRUE]) 

str(Catalog$IDENTIFY) 

Ord.factor w/ 112 levels "brown-dotted yellow lead-glazed buff earthenware"<..: 63 85 48 59 17 112 4 24 36 8 ... 
+0

は統計に ')(関数'リオーダーを見てくださいパッケージ(すなわち、ベースR)。 – Andrie

+0

再注文(カタログ$ IDENTIFY、カタログ$ MIDDATE) 'を試みましたが、重複レベルとIDENTIFYに関するすべての警告が「NA」になりました... – Scard

+1

再現可能なコードなしであなたを助けるのは少し難しいです。再現可能な例を試してみることができますか?見てみましょうか? – Andrie

答えて

28

は、ここで溶液で、再現可能なサンプルです:

新しい因子の今
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 'には繰り返し値がありません)。

+0

ありがとうございます。私はこれを試して、それがどうなるか見てみましょう。私はMIDDATEから独立した順序付けられた要素ベクトルを作る必要があると思うが、フィールドの組み合わせは重複の問題を避けるべきである(3つは固有の位置を作るべきである)。 – Scard

+0

それはそれをしました。ありがとうございました。 – Scard

+1

誰かがあなたの質問に答えている場合は、チェックマーク(緑色の色)を使ってそのように表示することをお勧めします。これは礼儀正しく、将来のサーチャーに大きな助けとなります。 –

12

私はあなたが好きなだけの列に拡張することができることを、次のdplyrベースのアプローチ(H/T daattali)をお勧めします:

library(dplyr) 
Catalog <- Catalog %>% 
    arrange(MIDDATE, TYPENAME) %>%    # sort your dataframe 
    mutate(IDENTIFY = factor(IDENTIFY, unique(IDENTIFY))) # reset your factor-column based on that order 
+0

次のエラーメッセージが表示されます: 'レベルのエラー' - '(* tmp *'、value = if(nl == nL)as.character(ラベル)else paste0(labels、: factor level [2] 'IDENTIFY'と' TYPENAME'の両方で繰り返し値を持っています...このトリックは一意の値を持つ列に対してのみ機能しますか? –

+1

これは考えました: 'IDENTIFY'は値が重複していますので、定義 –

関連する問題