изменения значений (избегайте от 0 1 до 1 2) - PullRequest
2 голосов
/ 11 апреля 2020

Я хочу преобразовать коэффициент в цифру c, чтобы иметь возможность получить среднее значение, поскольку .numeri c меняет значение, цифра c не работает.

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

ожидаемые результаты должны быть цифрами c и состоять только из 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 Ответ

2 голосов
/ 11 апреля 2020

Нам нужно преобразовать в символ, а затем в 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
...