as.numeric(as.factor(x)):为什么这个表达式可以重新排列非连续数据序列

时间:2016-07-10 19:34:44

标签: r

我有一个带有非连续数字标签的组变量

  user_id<-c(2,5,7,9)

我想用连续数字重命名user_id。以下代码将起作用。但我想知道为什么?还有其他任何方式

new_id<- as.numeric(as.factor(user_id))
new_id
output:
1,2,3,4

2 个答案:

答案 0 :(得分:3)

factor级别的内部表示为integer因此,当我们直接强制数字时,它将转换为该整数值。 OP在这里得到了预期的输出只是巧合。假设,我们通过sample创建一个新的向量。

 set.seed(24)
 v1 <- sample(letters[1:4], 10, replace=TRUE)
 as.numeric(factor(v1))
 #[1] 2 1 3 3 3 4 2 4 4 2

其中

 v1
 #[1] "b" "a" "c" "c" "c" "d" "b" "d" "d" "b"

请注意,值会重复,并且不是序列的预期输出。

如果我们需要创建与&#39; new_id&#39;

相同的内容
 seq(length(user_id))

答案 1 :(得分:2)

您可能希望使用seq_along(user_id)来创建新ID

user_id <- c(2,5,7,9)
new_id  <- seq_along(user_id)
# [1] 1 2 3 4

修改

作为@MatthewLundberg评论的后续内容,这是一个将考虑重复用户ID的版本;这使用dplyr函数dense_rank。这假设重复将获得相同的“new_id”。

library(dplyr)

user_id <- c(2, 5, 7, 9, 2, 2, 7)
new_id  <- dense_rank(user_id)
new_id
# [1] 1 2 3 4 1 1 3