#r #type-conversion
#r #тип-преобразование
Вопрос:
Итак, после того, как я импортировал data.set через memsci (что сработало очень хорошо, кстати! :)), Теперь у меня проблема в том, что почти все данные преобразуются в (неупорядоченные) коэффициенты, но уровни не 1,2,3,4,5 (как и должно быть для вычислений), а скорее «полностью согласны» вплоть до «вообще не согласны».
Это приводит к проблеме, которую я не могу использовать as.numeric(levels(f))[f]
для преобразования коэффициента в цифры.
Чтобы импортировать мои данные, я использовал это:
data <- as.data.set(spss.system.file("data.sav"))
dat <- as.data.frame(data)
Однако: информация, похоже, есть.
str(var1)
Factor w/ 5 levels "don't agree at all",..: NA 1 1 1 1 1 1 1 1 1 ...
labels(dat$var1)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12"
[13] "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24"
levels(dat$var1)
[1] "do not agree at all" ". ." ". . ."
[4] ". . . ." "fully agree"
Где хранятся значения? Я пробовал labels(var1)
и просто var1
, но у меня ничего не работает. Однако: Использование as.numeric(var1)
дает мне необходимую информацию, НО я не думаю, что следует применять это, как указано в справке R для факторов. Также после использования dat[,1:ncol(dat)] <- lapply(dat[,1:ncol(dat)], function(x) as.numeric(x))
переменная по-прежнему считается фактором и ведет себя точно так же, как и раньше.
Редактировать: воспроизводимый пример благодаря @jakub
var1 <- factor(c(1,2,3,4,5,5,4,3,2,1),
levels = as.character(1:5),
labels = c("Fully agree", "....", "...", "..", "Do not agree at all"))
Комментарии:
1. пожалуйста, опубликуйте воспроизводимый пример (с кодом), чтобы другие могли воспроизвести вашу проблему
2. попробуйте
as.numeric(var1)
, это должно сработать3. На самом деле я не могу опубликовать воспроизводимый пример. Насколько я понимаю, код для одного будет выглядеть так:
var1 <- factor(c(1,2,3,4,5,5,4,3,2,1), levels = c("Fully agree", "....", "...", "..", "Do not agree at all"), labels = as.character(1:10))
Это не та команда, которая работает. Но для меня данные выглядят так, как будто они были созданы таким образом.4. В вашем примере переключите
labels
иlevels
; такжеas.character(1:10)
должно бытьas.character(1:5)
.
Ответ №1:
Вы говорите:
as.numeric(var1)
дает мне нужную мне информацию, НО я не думаю, что следует применять это, как указано в справке R для факторов
Если вы ссылаетесь на:
В частности,
as.numeric
применение к коэффициенту не имеет смысла и может происходить путем неявного принуждения.
тогда вы, скорее всего, путаете две проблемы. Вам нужны либо метки, либо уровни.
Если у вас есть числовые значения, которые являются метками фактора, тогда вам действительно нужно преобразовать в числовое использование as.numeric(levels(f))[f]
. Пример:
var1 <- factor(c(1,2,3,1),
labels = c("123", "5", "-11"),
levels = as.character(1:3))
levels(var1)
# [1] "123" "5" "-11"
as.numeric(var1)
# [1] 1 2 3 1 #this indeed does not make much sense - the values are lost!
as.numeric(levels(var1))[var1]
#[1] 123 5 -11 123
Но в вашем случае это не применимо, потому что (если я правильно понял) вам нужны не метки, а базовые целые числа. Для вас это имеет смысл, что Fully agree
означает 1
. В таком случае as.numeric(var1)
все в порядке.
Комментарии:
1. Однако по какой-то причине вы в точности соответствуете тому, что сказали
var1 <- as.numeric(var1)
. Отлично работает на примере, который выглядит как мой data.set. Но если я использую его в своем наборе данных, var1 отображается как числовой в рабочей области (пока все хорошо), ноis.numeric(var1)
все равноFALSE
, покаis.factor(var1)
естьTRUE
. Я действительно не понимаю, почему, и я предположил, что именно поэтому as.numeric также не следует использовать в этом случае. Может ли это быть связано с преобразованием из data.set в data.frame? Хотя это кажется странным.2. Я не знаком
data.set
. Но что произойдет, если вы вызоветеdat$var1 = as.numeric(dat$var1)
and thenclass(dat$var1)
?3. Я нашел свою ошибку. Я использовал
attach(dat)
раньше. Которые не приводят к изменениям при использованииstr(var1)
для подтверждения того, что это стало числовым. После повторногоattach(dat)
запуска или неиспользования он действительно отображается как числовой правильно. Это странное поведение наattach()
стороне s или я все время использовал I неправильно? o_o Спасибо за большую помощь в любом случае, я отметил ваш ответ как правильный, конечно!4. Честно говоря, когда я слышу
attach
, я кричу от боли и убегаю. Возможно, другие люди нашли способattach
эффективного использования, но для меняattach
это затрудняет отслеживание моего кода, потому что я должен постоянно помнить, что где-то в строке я вызвал attach на что-то, и это делает меня очень склонным к ошибкам, которые трудно обнаружить.