值更改(避免从0 1到1 2)

3

我想把因子转换成数字,这样就可以对它们求平均数了。使用as.numeric进行转换,否则用numeric是不行的。

mtcars$vec <- factor(c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))

        num.cols <- c("vec" ) 
        mtcars[num.cols] <- lapply(mtcars[num.cols], as.numeric) 
        str(mtcars)

        mtcars$vec

期望结果应为数字,且仅由0和1组成。
mtcars$vec
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

非常感谢您的预先帮助。

1
mtcars$vec <- as.numeric(as.character(mtcars$vec)) - Ronak Shah
1个回答

4

我们需要将其转换为字符然后再转换为数字,因为如果我们直接使用as.numeric,它会强制转换为整数存储值而不是从1开始的实际值。在这种情况下,存在二进制值的混淆。

mtcars[num.cols] <-  lapply(mtcars[num.cols], 
              function(x) as.numeric(as.character(x))) 
mtcars$vec
#[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

或者另一个更快的选项是

mtcars[num.cols] <- lapply(mtcars[num.cols],  function(x) as.numeric(levels(x)[x]))

如果只有一个列,我们可以更容易地完成这个操作。
mtcars[[num.cols]] <- as.numeric(levels(mtcars[[num.cols]])[mtcars[[num.cols]]])

作为示例。
v1 <- factor(c(15, 15, 3, 3))
as.numeric(v1)
#[1] 2 2 1 1

as.numeric(as.character(v1))
#[1] 15 15  3  3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接