8

最初にいくつかの要素を作成しましょう。

F1 <- factor(c(1,2,20,10,25,3))
F2 <- factor(paste0(F1, " years"))
F3 <- F2
levels(F3) <- paste0(sort(F1), " years")
F4 <- factor(paste0(F1, " years"), levels=paste0(sort(F1), " years"))

次に、それらを見てください。

> F1
[1] 1  2  20 10 25 3 
Levels: 1 2 3 10 20 25

> F2
[1] 1 years  2 years  20 years 10 years 25 years 3 years 
Levels: 1 years 10 years 2 years 20 years 25 years 3 years

> F3
[1] 1 years  3 years  10 years 2 years  20 years 25 years
Levels: 1 years 2 years 3 years 10 years 20 years 25 years

> F4
[1] 1 years  2 years  20 years 10 years 25 years 3 years 
Levels: 1 years 2 years 3 years 10 years 20 years 25 years

まず、F2のレベルの「予想される」順序はF1とは似ていないことに注意してください。ドキュメントを見ると、factorその理由がわかります。レベルは、最初に入力を並べ替えることによって作成されます。F2の場合、これらは文字列であり、ソートでは長さが考慮されます(?)。

私が理解しにくいのは、F3とF4のレベル設定の違いです。F3では、ファクターの作成後にレベルを設定しましたが、F4では、ファクターの作成時に明示的にレベルを設定しました。F3では、levels()<-の使用は、純粋にレベルの再ラベル付けではありませんが、期待どおりにレベルを並べ替えることもありません。

誰かが違いを説明できますか?

4

2 に答える 2

10

F1あなたが自分で考え出したように、数値ソートを使用します。

F2は辞書式ソートを使用し、最初の文字を比較し、2 番目の文字を使用して同点を解消する、というようになります。これが"10 years"と の間にある理由です。"1 years""2 years"

F4は文字ベクトルから作成されますが、考えられる要素の明示的なリストがあります。そのリストは (ソートなしで) 取得され、1 から 6 までの数字で識別されます。次に、入力のすべての項目が可能なレベルのセットと比較され、関連付けられた数字が保存されます。結局のところ、要因は、as.numeric印刷に使用されるレベルのリストに関連付けられた数字の集まりです (表示されます)。SoF4は と同じようF2に出力されますが、そのレベルは異なる方法でソートされます。

F3は F2 から作成されたため、最初はレベルがソートされていませんでした。割り当ては、ベクトル内の数値ではなく、レベル名のセットのみを置き換えます。したがって、これは既存のレベルの名前を変更するものと考えることができます。番号を見ると、それらは の番号と一致しますが、F2関連付けられている名前、特に名前の順序は の番号と一致しF4ます。

あなたの質問は、これは純粋なラベル変更ではないと主張しているため、はい、純粋なラベル変更です。次の変更を使用して取得F3F2ます(印刷物の両方の行で):

  • 10 → 2
  • 2 → 3
  • 20 → 10
  • 25 → 20
  • 3 → 25

このstr関数は、因子の内部表現を調べるための優れたツールでもあります。

于 2012-07-20T22:14:40.143 に答える
7

F2次のデータから作成しました。

> paste0(F1, " years")
[1] "1 years"  "2 years"  "20 years" "10 years" "25 years"
[6] "3 years"

一意の値を並べ替えてレベルを生成すると、言及した英数字の並べ替えが行われます

> levels(F2)
[1] "1 years"  "10 years" "2 years"  "20 years" "25 years"
[6] "3 years"

したがって、"2 years"実際には として保存されます3- それは 3 番目のカテゴリまたはレベルにあります。これにより、データが因子に格納される方法に微妙な違いが生じることに注意してください。

> as.numeric(F1)
[1] 1 2 5 4 6 3
> as.numeric(F2)
[1] 1 3 4 2 5 6

のレベルをF3明示的に設定すると、次の値が渡されます。

> paste0(sort(F1), " years")
[1] "1 years"  "2 years"  "3 years"  "10 years" "20 years"
[6] "25 years"

上記から、データは次のように保存されF3ました。

> as.numeric(F3)
[1] 1 3 4 2 5 6

したがって、 の 2 番目の要素は、指定した3 番目F3のレベルを取得します。."3 years"

levels<-したがって、数値表現と表示されるラベルの間のマッピングが変更されます。これは、あなたが期待しているように見える要素を再配置または再調整する方法ではないことは間違いありません. levels<-データの並べ替えも行わず、因子のレベルを変更するだけです。基礎となる数値表現は引き続き保持されるため、新しいレベルにマップされます。

ではF4、作成時にレベルを明示的に設定するため、データは と同じ方法で数値的に保存されますF1

> F4 <- factor(paste0(F1, " years"), levels=paste0(sort(F1), " years"))
> as.numeric(F4)
[1] 1 2 5 4 6 3

F3と の間に見られる違いを引き起こしているのは、個々のデータ ポイントのデータの基礎となる異なる数値表現 (または元のレベルへのマッピング) ですF4

私は以前これに噛まれたことがあり、今では注意する必要があることを知っていますが、時々私を捕まえます.

于 2012-07-20T22:16:19.633 に答える