考虑数据框架
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})
不幸的是,这只会将值替换为 character
列 var2
的各自因子级别,而不是 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
列中的值 12
( c[10,'var1']
)被视为第3个值(它在 1
和 2
之后为值 0
和 1
分配因子级别 3
而不是最后一个值(因子级别 6
)因为它是 var1
中最大的数值 .
有没有办法在数字排序的基础上分配因子水平,同时用因子水平替换数值?
1 回答
根据描述,似乎OP想要将
levels
更改为从1开始的数值 . 这可以使用match
来完成数据
根据注释中的代码,替换
str_pad
的另一个选项是