考虑数据框
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
的值(注意{{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
列中的值12
(c[10,'var1']
)被视为第3个值(在{@ 1}}之后被赋予因子等级var1
值3
和1
的级别2
和0
而不是最后一个值(因子级别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)