重新解决一个因素

时间:2013-09-16 12:02:04

标签: r r-factor

给出了无序因子ID,每个级别的等级的参考向量和每个级别的标签。现在我想按给定的等级排序ID,之后我想覆盖因子中的标签。

如果有更好的方法可以提供建议:

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)])

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

答案 2 :(得分:1)

假设RankLabel总是处于相同的顺序,您只需要适当地订购标签,然后使用它们来创建有序因子。

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