【问题标题】:How to change name of factor levels?如何更改因子级别的名称?
【发布时间】:2015-06-25 00:07:30
【问题描述】:

训练集

trainSample <- cbind(data[1:980,1], data[1:980,2]) cl <-
factor(c(data[1:980,3]))

测试集

testSample <- data(data[981:1485,1], data[981:1485,2])
cl.test <- clknn

预测

k <- knn(trainSample, testSample, cl, k = 5)

输出

< k

  [1] 2 2 1 1 1 1 2 1 2 1 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2
 [60] 2 2 2 2 1 2 2 2 2 1 2 2 1 2 2 2 1 1 2 1 2 2 1 1 1 2 1 2 2 2 1 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2
[119] 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 1 1 1 1 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2
[178] 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1
[237] 2 2 2 2 2 1 2 2 1 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 1 2 1 2 2 2 2 1 1 2 1 2 2 2 2 1 2 2 2
[296] 2 2 2 1 2 1 2 1 1 1 2 1 2 2 1 1 2 2 1 2 1 2 2 1 2 2 2 1 2 2 2 2 2 1 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 1 2 1 1 2 2 2 1 1 2
[355] 1 2 1 2 1 2 1 2 2 2 2 2 2 1 1 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
[414] 2 2 1 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[473] 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 1 1 2 2 1 2 2 1 2 1 2 2 1 2 2 2 2 2
Levels: 1 2

我想要“c”和“not-c”(就像在我的原始 data.csv 中一样),而不是 1 和 2(我也不确定哪个数字应该代表哪个)

谁能帮忙?

【问题讨论】:

    标签: r rename levels


    【解决方案1】:

    改变因子水平很容易,也不会混淆哪个是哪个:

    示例数据:

    > a <- factor(rep(c(1,2,1),50))
    > a
      [1] 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2
     [75] 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1
    [149] 2 1
    Levels: 1 2
    
    #this will help later as a verification
    #this counts the instances for 1 and 2
    > table(a)
    a
      1   2 
    100  50 
    

    正如您在上面看到的,级别的顺序是1 第一和2 第二。当您更改级别(如下)时,顺序保持不变:

    #the assignment function levels can be used to change the levels
    #the order will remain the same i.e. 'c' for '1' and 'not-c' for '2'
    levels(a) <- c('c', 'not-c')
    
    > a
      [1] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
     [25] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
     [49] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
     [73] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
     [97] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
    [121] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
    [145] c     not-c c     c     not-c c    
    Levels: c not-c
    

    这是验证:

    > table(a)
    a
        c not-c 
      100    50 
    

    【讨论】:

    • 你为我回答了一个关于 ensemble 的问题,我正在努力寻找另一个分类器来使用,以及如何考虑每个分类器的结果,即如何考虑这个“h_results$TrueLabel== nb_results$Prediction" 还是分类器为我做的?对此感到抱歉。
    • 没问题,乐于助人:)。对于组合分类器,您的意思是?正如我所说,你可以使用任何你喜欢的。我不知道你为什么要考虑h_results$TrueLabel==nb_results$Prediction(也许稍后再使用table?),但假设它们的长度相等,只需将其包装在factor 函数中即可。
    • 我会建议如果您的问题更深入,并且您需要有关某事的更多信息来提出新问题(添加可重现的示例和想要的输出)并且人们会提供帮助。如果您愿意,您也可以将此处的链接发送给我以尝试自己回答。 (我这样说是因为在cmets中很难尝试通过聊天来解决问题)
    • 感谢您的回复,是的,该代码为每个数据样本提供了一个真正的错误结果,例如诸如 TRUE TRUE TRUE FALSE TRUE 之类的东西是否正确,我是否需要将其和其他分类器也考虑在内,然后将它们全部组合在一个表中,并将该表与真实标签也在那里分类? (我希望我刚才说的有任何意义)哈哈
    • 将真实标签与预测标签进行比较仅用于衡量准确性。在组合模型中,您只需使用预测值。
    【解决方案2】:

    下标赋值也有效。例如,这里有一个因素:

    > a <- factor(sample(letters[1:5],100,replace=T))
    > a
      [1] a d d d d a d d a b a b e a c d a c a a b e e d a e d e e a a c a a a b a
     [38] b b a a e b d b c a a a b e b c e d d b b c c a b a d c b c c d e b d e d
     [75] a a a b e e c b c b c c d d e e d a e e e b c e b e
    Levels: a b c d e
    

    现在,让我们给其中几个关卡起个新名字:

    > levels(a)[c(2,4)] <- c('y','z')
    > a
      [1] a z z z z a z z a y a y e a c z a c a a y e e z a e z e e a a c a a a y a
     [38] y y a a e y z y c a a a y e y c e z z y y c c a y a z c y c c z e y z e z
     [75] a a a y e e c y c y c c z z e e z a e e e y c e y e
    Levels: a y c z e
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      x<-factor(c(1,1,2,3,1), labels=c("group1","group2","group3")) 
      > x 
      [1] group1 group1 group2 group3 group1 
      Levels: group1 group2 group3
      

      或者像这样:

      train <- read.csv("train.csv", header=TRUE)[1:1000, ]
      labels <- train[,1]
      

      【讨论】:

      • 这种工作,但我怎么知道我的原始数据集中哪个是哪个?我可以交换名称,结果会反转,但准确性保持不变,所以这显然是不对的?谢谢
      • 我不能让你的第二部分工作,我不太明白,我试过这个 newPred
      【解决方案4】:

      使用 forcats 包。

      a <- factor(rep(c(1,2,1),50))
      
      fct_collapse(a,c = c("1"),`not-c` = c("2"))
      

      【讨论】:

      • 不错。一项不需要c()s:fct_collapse(a, c = "1", `not-c` = "2")
      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多