值变化(避免0 1到1 2)

问题描述 投票:0回答:1

我想将因子转换为数值,以便能够取其平均值,因为数值会更改值,数值不起作用。

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

非常感谢

r dplyr tidyr plyr data-manipulation
1个回答
0
投票

我们需要先转换为字符,然后转换为numeric,因为如果我们直接应用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
© www.soinside.com 2019 - 2024. All rights reserved.