【问题标题】:mutate string into numeric, ignore alphabetical order of factor将字符串变为数字,忽略因子的字母顺序
【发布时间】:2021-02-02 13:31:32
【问题描述】:

我正在尝试使用 mutate 函数将因子级别重新编码为数字,但我想忽略因子出现的字母顺序。因子级别有多个相同的值,我希望为它们分配新列中的数字它们首次出现在数据框中的行。 示例:

library(stringi)
set.seed(234)


data<-stri_rand_strings(20,1)
data<-as.data.frame(data)
data2<-data %>% mutate(num=(as.numeric(factor(data))))
data2

预期结果:

dat<-data2[,-2]
order<-c(1,2,3,2,4,5)
expected_result<-cbind.data.frame(head(dat), order)  
expected_result

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我认为您可以在示例中创建一个新的factor 并将levels 设置为uniquedata2$data 值:

    new_fac <- factor(data2$data, levels = unique(data2$data))
    

    可以得到数值:

    new_order <- as.numeric(new_fac)
    

    这就是你的最终结果:

    head(data.frame(new_fac, new_order))
    
      new_fac new_order
    1       k         1
    2       m         2
    3       1         3
    4       m         2
    5       4         4
    6       d         5
    

    或者在您使用dplyr 的示例中,您可以这样做:

    data %>%
      mutate(num = as.numeric(factor(data, levels = unique(data))))
    

    【讨论】:

      【解决方案2】:

      您可以使用包含字符串第一次出现在表中的行号的辅助表来完成此操作。即

      library(stringi)
      library(tidyverse)
      
      # generate data 
      data<-stri_rand_strings(20,1)
      data<-as.data.frame(data)
      

      创建辅助表:

      factorlevels <- data %>% unique() %>% mutate(order = row_number())
      

      ...和数据的内部连接

      data %>% inner_join(factorlevels) 
      

      输出:

      > data %>% inner_join(factorlevels)
      Joining, by = "data"
         data order
      1     k     1
      2     m     2
      3     1     3
      4     m     2
      5     4     4
      6     d     5
      7     v     6
      8     i     7
      9     v     6
      10    H     8
      11    Y     9
      12    X    10
      13    a    11
      14    a    11
      15    0    12
      16    R    13
      17    J    14
      18    j    15
      19    8    16
      20    s    17
      

      我确信有一种单一的方法可以解决这个问题,但我无法立即弄清楚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2018-01-14
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多