Как преобразовать столбец 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), а не самим уровням.