Преобразование коэффициентов с именами символов в цифры (после импорта из файла .sav)

#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 then class(dat$var1) ?

3. Я нашел свою ошибку. Я использовал attach(dat) раньше. Которые не приводят к изменениям при использовании str(var1) для подтверждения того, что это стало числовым. После повторного attach(dat) запуска или неиспользования он действительно отображается как числовой правильно. Это странное поведение на attach() стороне s или я все время использовал I неправильно? o_o Спасибо за большую помощь в любом случае, я отметил ваш ответ как правильный, конечно!

4. Честно говоря, когда я слышу attach , я кричу от боли и убегаю. Возможно, другие люди нашли способ attach эффективного использования, но для меня attach это затрудняет отслеживание моего кода, потому что я должен постоянно помнить, что где-то в строке я вызвал attach на что-то, и это делает меня очень склонным к ошибкам, которые трудно обнаружить.