Когда я преобразую коэффициент в числовое или целое число, я получаю коды базового уровня, а не значения в виде чисел.
f <- factor(sample(runif(5), 20, replace = TRUE))
## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041
## [4] 0.0284090070053935 0.363644931698218 0.363644931698218
## [7] 0.179684827337041 0.249704354675487 0.249704354675487
## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935
## [13] 0.179684827337041 0.0248644019011408 0.179684827337041
## [16] 0.363644931698218 0.249704354675487 0.363644931698218
## [19] 0.179684827337041 0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218
as.numeric(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
as.integer(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
Я должен прибегнуть paste
к получению реальных ценностей:
as.numeric(paste(f))
## [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
## [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901
Есть ли лучший способ преобразовать коэффициент в числовой?
attributes(f)
), поэтому я не думаю, что с этим что-то не такas.numeric(paste(f))
. Возможно, было бы лучше подумать, почему (в конкретном контексте) вы получаете фактор в первую очередь, и попытаться остановить это. Например, правильно ли заданdec
аргументread.table
?df %>% convert(num(column))
, Или, если у вас есть фактор-вектор, который вы можете использоватьas_reliable_num(factor_vector)
Ответы:
Смотрите раздел Предупреждение
?factor
:FAQ по R имеет аналогичные советы .
Почему
as.numeric(levels(f))[f]
эффективнее, чемas.numeric(as.character(f))
?as.numeric(as.character(f))
эффективноas.numeric(levels(f)[f])
, поэтому вы выполняете преобразование в числовыеlength(x)
значения, а неnlevels(x)
значения. Разница в скорости будет наиболее очевидной для длинных векторов с несколькими уровнями. Если значения в основном уникальны, разницы в скорости не будет. Как бы вы ни выполняли преобразование, эта операция вряд ли станет узким местом в вашем коде, поэтому не стоит сильно беспокоиться об этом.Некоторые сроки
источник
R имеет ряд (недокументированных) удобных функций для преобразования факторов:
as.character.factor
as.data.frame.factor
as.Date.factor
as.list.factor
as.vector.factor
Но досадно, что нечего обрабатывать фактор -> числовое преобразование. В качестве продолжения ответа Джошуа Ульриха я бы предложил преодолеть это упущение с помощью определения вашей собственной идиоматической функции:
что вы можете сохранить в начале вашего скрипта, или даже лучше в вашем
.Rprofile
файле.источник
as.integer(factor)
возвращает базовые целочисленные коды (как показано в разделе примеров?factor
). Вероятно, можно определить эту функцию в вашей глобальной среде, но у вас могут возникнуть проблемы, если вы на самом деле зарегистрируете ее как метод S3.factor->numeric
преобразования много , прежде чем понял , что это на самом деле недостаток R: некоторые функции удобства должны быть доступны ... Вызов этоas.numeric.factor
имеет смысл для меня, но YMMV.v=NA;as.numeric.factor(v)
илиv='something';as.numeric.factor(v)
, тогда это должно быть, иначе у вас что-то странное происходит.Самый простой способ - использовать
unfactor
функцию из пакета varhandle.Этот пример может быть быстрым началом:
источник
unfactor
функции обращенные к типу символьных данных, а затем преобразует назад в числовой. Введитеunfactor
в консоли, и вы можете увидеть его в середине функции. Поэтому оно не дает лучшего решения, чем то, что уже было у автора.unfactor
Функция заботится о вещах , которые не могут быть преобразованы в числовой. Проверьте примеры вhelp("unfactor")
library("varhandle")
сначала загрузить пакет ( ) (как я уже упоминал в первой строке моего ответа !!)as.numeric()
иas.character()
в неправильном порядке;) То, что делает ваш фрагмент кода, это превращает индекс уровня фактора в матрицу символов, так что вы будете иметь в и является символьным вектором, который содержит несколько чисел, которые когда-то были присвоены определенному уровню вашего фактора. Функции в этом пакете предназначены для предотвращения этих недоразуменийПримечание. Этот конкретный ответ предназначен не для преобразования числовых факторов в числовые, а для преобразования категориальных факторов в соответствующие им номера уровней.
Каждый ответ в этом посте не дал результатов для меня, NA были сгенерированы.
Что сработало для меня это -
источник
y<-factor(c("5","15","20","2")); unclass(y) %>% as.numeric
Это возвращает 4,1,3,2, а не 5,15,20,2. Это похоже на неверную информацию.as.numeric(y)
должно было работать просто отлично, не нужноunclass()
. Но опять же, это не то, о чем этот вопрос. Этот ответ не подходит здесь.Это возможно только в том случае, если метки фактора соответствуют исходным значениям. Я объясню это на примере.
Предположим, данные являются векторными
x
:Теперь я создам фактор с четырьмя метками:
1)
x
с типом double,f
с типом integer. Это первая неизбежная потеря информации. Факторы всегда хранятся в виде целых чисел.2) Невозможно вернуться к исходным значениям (10, 20, 30, 40), имеющим только
f
доступные. Видно, чтоf
содержит только целые значения 1, 2, 3, 4 и два атрибута - список меток («A», «B», «C», «D») и атрибут класса «factor». Ничего больше.Чтобы вернуться к исходным значениям, мы должны знать значения уровней, используемых при создании фактора. В этом случае
c(10, 20, 30, 40)
. Если мы знаем исходные уровни (в правильном порядке), мы можем вернуться к исходным значениям.И это будет работать только в том случае, если метки были определены для всех возможных значений в исходных данных.
Поэтому, если вам понадобятся исходные значения, вы должны их сохранить. В противном случае есть большая вероятность, что вернуться к ним будет невозможно только из-за фактора.
источник
Вы можете использовать,
hablar::convert
если у вас есть фрейм данных. Синтаксис прост:Образец df
Решение
дает тебе:
Или, если вы хотите, чтобы один столбец был целым, а другой - числовым:
результаты в:
источник
Похоже, решение as.numeric (уровней (f)) [f] больше не работает с R 4.0.
Альтернативное решение:
источник
Из многих ответов, которые я мог прочитать, единственным способом было увеличить количество переменных в соответствии с количеством факторов. Если у вас есть переменная «домашнее животное» с уровнями «собака» и «кошка», вы в конечном итоге получите pet_dog и pet_cat.
В моем случае я хотел остаться с тем же числом переменных, просто переводя факторную переменную в числовую, таким образом, чтобы ее можно было применить ко многим переменным со многими уровнями, например, для cat = 1 и dog = 0.
Пожалуйста, найдите соответствующее решение ниже:
источник
поздно к игре, случайно, я нашел,
trimws()
может преобразоватьfactor(3:5)
вc("3","4","5")
. Тогда вы можете позвонитьas.numeric()
. Это:источник
trimws
более,as.character
как описано в принятом ответе? Мне кажется, что если у вас фактически нет пробела, который вам нужно было удалить,trimws
просто сделайте кучу ненужной работы с регулярными выражениями, чтобы вернуть тот же результат.