Как преобразовать столбец data.frame из Factor в числовой

У меня есть data.frame, столбец которого Factor. Я хотел бы преобразовать его в числовой, чтобы я мог использовать корреляционную матрицу.

> str(breast)
'data.frame':   699 obs. of  10 variables:
 ....
 $ class                   : Factor w/ 2 levels "2","4": 1 1 1 1 1 2 1 1 1 1 ...
> table(breast$class)
  2   4 
458 241
> cor(breast)
Error in cor(breast) : 'x' must be numeric

Как преобразовать столбец Factor в числовой столбец?

Ответы

Ответ 1

breast$class <- as.numeric(as.character(breast$class))

Если у вас есть много столбцов для преобразования в numeric

indx <- sapply(breast, is.factor)
breast[indx] <- lapply(breast[indx], function(x) as.numeric(as.character(x)))

Другим вариантом является использование stringsAsFactors=FALSE при чтении файла с помощью read.table или read.csv

На всякий случай другие варианты создания/изменения столбцов

 breast[,'class'] <- as.numeric(as.character(breast[,'class']))

или

 breast <- transform(breast, class=as.numeric(as.character(breast)))

Ответ 2

От ?factor:

Чтобы преобразовать коэффициент f примерно в исходные числовые значения, рекомендуется as.numeric(levels(f))[f] и немного эффективнее, чем as.numeric(as.character(f)).

Ответ 3

Это FAQ 7.10. Другие продемонстрировали, как применить это к одному столбцу в фрейме данных или к нескольким столбцам в фрейме данных. Но это действительно относится к симптому, а не к лечению причины.

Лучший подход заключается в использовании аргумента colClasses для read.table и связанных функций, чтобы сообщить R, что столбец должен быть числовым, чтобы он никогда не создавал фактор и не создавал числовые. Это приведет к NA для любых значений, которые не преобразуются в числовые.

Еще один лучший вариант - выяснить, почему R не распознает столбец как числовой (обычно не числовой символ где-то в этом столбце) и исправить исходные данные, чтобы он читался правильно, без необходимости создавать NA s.

Best представляет собой комбинацию последних 2, убедитесь, что данные верны, прежде чем читать их, и укажите colClasses, поэтому R не нужно угадывать (это также может ускорить чтение).

Ответ 4

В качестве альтернативы нотации $dollarsign используйте блок within:

breast <- within(breast, {
  class <- as.numeric(as.character(class))
})

Обратите внимание, что вы хотите преобразовать вектор в символ перед преобразованием его в числовое. Просто вызов as.numeric(class) не будет идентификаторами, соответствующими каждому уровню фактора (1, 2), а не самим уровням.