2013-09-16 3 views
2

Дано неупорядоченное идентификатор фактора, опорный вектор для ранга каждого уровня и метка для каждого уровня. Теперь я хочу заказать идентификаторы по заданному рангу, после чего я хочу переопределить метки в коэффициенте.Освобождение фактора

Не могли бы вы дать советовать, если есть лучший способ сделать это:

ID<-factor(c(1,2,2,3,1,3,3,2,1,1)+10) 
Rank<-c("11"=3,"12"=1,"13"=2) 
Label<-c("11"="B","12"="A","13"="C") 
ID.Rank<-factor(ID, levels=names(Rank),labels=Rank) 
ID.Rank<-factor(ID.Rank, levels=sort(Rank),order=T) 
ID.Label<-factor(ID, levels=names(Label),labels=Label) 
data.frame(ID,ID.Rank,ID.Label) 
### here is importent that ID.Rank has a certain order. 
factor(ID.Rank, labels=Label[match(levels(ID.Rank), Rank)]) 
+0

Я смущен тремя схемами маркировки. У вас есть ID, Rank и Label, но поскольку идентификатор и ранг являются числовыми, я не знаю, соответствуют ли номера, соответствующие меткам идентификаторам или рангу. Чтобы быть яснее, я предложил бы сделать идентификаторы 11:13, а также показать желаемый результат. – Aaron

+0

@ Аарон ID <-фактор (образец (11: 13,10, T)); ID; idlvl <-levels (ID); Ранг <-c ("11" = 3, "12" = 1, "13" = 2); idrank <-Rank [as.character (idlvl)]; ID <-фактор (идентификатор, метки = idrank); ID <-фактор (идентификатор, уровни = 1: длина (idrank), порядок = T); ID; Этикетка <-c ("11" = "B", "12" = "A", "13" = "C"); idlabel <-Label [as.character (idlvl)]; factor (ID, levels = idrank, labels = idlabel); – Klaus

+0

Это дает другой результат, чем первый код. Что правильно? – Aaron

ответ

2

Если я правильно понял ваш вопрос, вот как вы можете решить эту проблему.

set.seed(2) 
ID<-as.numeric(ID) 
df1<-as.data.frame(ID) 
> df1 
    ID 
1 1 
2 1 
3 3 
4 2 
5 3 
6 2 
7 3 
8 3 
9 2 
10 3 
df2<-as.data.frame(Rank) 
df2$ID<-rownames(df2) 
> df2 
    Rank ID 
1 3 1 
2 1 2 
3 2 3 

df3<-merge(df1,df2,by="ID") 
    ID Rank 
1 1 3 
2 1 3 
3 2 1 
4 2 1 
5 2 1 
6 3 2 
7 3 2 
8 3 2 
9 3 2 
10 3 2 

df3$Rank является то, что вы ищете, как конечный результат. Вы можете преобразовать это в фактор.

Обновлено в соответствии с комментариями: Если вы хотите, первоначальный порядок ID:

df1$IDo<-rownames(df1) 
df3 
    ID IDo Rank 
1 1 1 3 
2 1 7 3 
3 1 4 3 
4 2 3 1 
5 2 9 1 
6 2 10 1 
7 3 2 2 
8 3 5 2 
9 3 6 2 
10 3 8 2 
+0

Thx, но в вашем решении я потерял порядок элементов в векторном ID. – Klaus

+0

Но вы можете получить это, прежде чем использовать 'merge' как' df1 $ IDo <-rownames (df1) '. См. Обновления – Metrics

2
myFac <- factor(ID, levels=Rank, labels=names(Rank)) 
myFac 
[1] 3 3 2 2 3 1 1 2 2 3 
Levels: 1 < 2 < 3 

match(levels(myFac), names(Label)) 
[1] 1 2 3 
Label[match(levels(myFac), names(Label))] 
    1 2 3 
"B" "A" "C" 
levels(myFac) <- Label[match(levels(myFac), names(Label))] 
myFac 
#----- 
[1] C C A A C B B A A C 
Levels: B < A < C 
+0

sry Я думаю, что я сделал что-то не так в моем старте, поэтому я все еще смущен. Я редактирую свой стартовый стол. – Klaus

1

Предполагая Rank и Label всегда в том же порядке, вам просто нужно заказать этикетки надлежащим образом, а затем использовать их создать упорядоченный коэффициент.

ID <- factor(c(1,2,2,3,1,3,3,2,1,1)+10) 
Rank <- c("11"=3,"12"=1,"13"=2) 
Label <- c("11"="B","12"="A","13"="C") 

Label <- Label[order(Rank)] 
factor(ID, levels=names(Label), labels=Label, order=TRUE) 
## [1] B A A C B C C A B B 
## Levels: A < C < B 
Смежные вопросы