2011-10-16 20 views
2

私はそこに2つの要因を持つデータフレームを持っていると私は第2のカテゴリでグループ化された1つの要因のレベルを並べ替えると思います。別のカテゴリに基づいて因子レベルを分類する方法は?

name <- letters[1:8] 
category <- factor(sample(1:2, 8, replace=T), labels=c("A", "B")) 
my.df <- data.frame(name=name, category=category) 

ように、データフレームは、のようになり:

name category 
1 a  A 
2 b  A 
3 c  B 
4 d  B 
5 e  B 
6 f  A 
7 g  A 
8 h  A 

levels(my.df$name)の出力である:

[1] "a" "b" "c" "d" "e" "f" "g" "h" 

nameにおけるレベルは常にcategory内の同じレベルに対応すると仮定すると私のデータでは、どのようにして名前のレベルを並べ替えることができますか?

+0

「相互作用」機能を使用して自分で回答を見つけましたが、別の8時間は投稿できません。コードは 'levels(df.test $ name)[(df.test、interaction(name、category、drop = T))]'となります。一方、他の洗練された答えはありますか? – Midnighter

答えて

4

これは必要なものですか?

私は、これは、これまでのソリューションのいずれかよりもきれいかもしれないと思う
> levels(my.df$name) <- as.character(unique(my.df[order(my.df$category),]$name)) 
> levels(my.df$name) 
[1] "b" "c" "e" "f" "a" "d" "g" "h" 
+1

私は要因のレベルを再配置し、それらを置き換えませんが、それは基本的に私が探しているものです。 'my.df $ name < - factor(my.df $ name、levels = as.character(unique。my.df [order(my.df $ category)]] $ name)))' – Midnighter

3

:としてよくやったが、それはそれは明らかではなかったことができ

my.df <- 
structure(list(name = structure(1:8, .Label = c("a", "b", "c", 
"d", "e", "f", "g", "h"), class = "factor"), category = structure(c(1L, 
1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor")), .Names = c("name", 
"category"), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8")) 

with(my.df, name[order(category)]) 
[1] b d e h a c f g 
Levels: a b c d e f g h 

あなたが要因をrelevelしたい場合は、その変更を永続的にすることを望みました。

+0

これはもっとクリーンですが、 'unique'呼び出しはこの単純なデータ以外のものにとって不可欠です。たぶん私は 'name'の複数のエントリについてもっと明示的にすべきでした。謝罪します。 – Midnighter

関連する問題