首页 文章

将数值转换为因子级别,并根据数字排序分配因子级别

提问于
浏览
1

考虑数据框架

a = c(0, 1, 3, 5, 6, 0, 1, 3, 6, 12)
b = c(letters[5:9], letters[2:6])
c = data.frame(var1 = a, var2 = b)

我想将数据框中的所有值转换为从 1 开始的连续整数因子级别,并使用这些作为数值来计算某些东西(实际上我不是为字母做这个,但我只是添加了这些来解释我的问题;) ) .

在一些帮助下(Converting numeric values of multiple columns to factor levels that are consecutive integers in (descending) order),我通过以下方式做到了:

c[] = lapply(c, function(x) {levels(x) <- 1:length(unique(x)); x})

不幸的是,这只会将值替换为 charactervar2 的各自因子级别,而不是 numeric 列的 var1 (请注意 var1 列中的 0

> c
   var1 var2
1     0    4
2     1    5
3     3    6
4     5    7
...

为了缓解这个问题,我在创建 c 时将所有列转换为字符

c = as.data.frame(sapply(data.frame(var1 = a, var2 = b), as.character))

这会产生

var1 var2
1     1    4
2     2    5
3     4    6
4     5    7
5     6    8
6     1    1
7     2    2
8     4    3
9     6    4
10    3    5

但是,此处的问题是 var1 列中的值 12c[10,'var1'] )被视为第3个值(它在 12 之后为值 01 分配因子级别 3 而不是最后一个值(因子级别 6 )因为它是 var1 中最大的数值 .

有没有办法在数字排序的基础上分配因子水平,同时用因子水平替换数值?

1 回答

  • 2

    根据描述,似乎OP想要将 levels 更改为从1开始的数值 . 这可以使用 match 来完成

    c[] <- lapply(c, function(x) factor(match(x, sort(unique(x)))))
    c
    #    var1 var2
    #1     1    4
    #2     2    5
    #3     3    6
    #4     4    7
    #5     5    8
    #6     1    1
    #7     2    2
    #8     3    3
    #9     5    4
    #10    6    5
    

    数据

    a <- c(0, 1, 3, 5, 6, 0, 1, 3, 6, 12)
    b <- c(letters[5:9], letters[2:6])
    c <- data.frame(var1 = a, var2 = b)
    

    根据注释中的代码,替换 str_pad 的另一个选项是

    c <- data.frame(var1 = sprintf("%02d", a), var2=b, stringsAsFactors=FALSE)
    

相关问题