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

时间:2017-02-27 16:51:34

标签: r

考虑数据框

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的各自因子级别,而不是numericvar1的值(注意{{1}在0列}

var1

为了缓解这个问题,我在创建> 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 列中的值12c[10,'var1'])被视为第3个值(在{@ 1}}之后被赋予因子等级var131的级别20而不是最后一个值(因子级别1,因为它是{{1}中的最大数值}})。

有没有办法根据数字排序分配因子水平,同时用数字值替换数字值?

1 个答案:

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