Удалить переменные этикетки, прикрепленные к иностранным / HMISC SPSS Import Functions

StackOverflow https://stackoverflow.com/questions/2394902

  •  25-09-2019
  •  | 
  •  

Вопрос

Как обычно, у меня есть несколько SPSS-файла, который я импортировал в r с spss.get функция от Hmisc упаковка. Я обеспокоен labelled класс этого Hmisc::spss.get добавляет ко всем переменным в data.frame, следовательно, хочу удалить его.

labelled класс дает мне головные боли, когда я пытаюсь бежать ggplot Или даже когда я хочу сделать какой-то политический анализ! Одно решение было бы удалением labelled класс из каждой переменной в data.frame. Отказ Как я могу это сделать? Это возможно вообще? Если нет, какие мои другие варианты?

Я действительно хочу обойти переменные Reediting «с нуля» с as.data.frame(lapply(x, as.numeric)) а также as.character Куда применимо ... И я, конечно, не хочу запускать SPSS и удалить метки вручную (не люблю SPSS, ни заботиться, чтобы установить его)!

Спасибо!

Это было полезно?

Решение

Вы можете избежать создания «помеченных» переменных в SPSS.GET с аргументом: use.value.labels = false.

w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate'))

Кодекс из Bhattacharya может потерпеть неудачу, если класс меченого вектора был просто «помечен», а не C («помечен», «фактор»), в этом случае он должен был быть:

class(x[[i]]) <- NULL  # no error from assignment of empty vector

Ошибка, которую вы сообщаете, можно воспроизводить с этим кодом:

> b <- 4:6
> label(b) <- 'B Label'
> str(b)
Class 'labelled'  atomic [1:3] 4 5 6
  ..- attr(*, "label")= chr "B Label"
> class(b) <- class(b)[-1]
Error in class(b) <- class(b)[-1] : 
  invalid replacement object to be a class string

Другие советы

Вот как я вообще избавляю от этикеток. Подобно решению Jyotirmoy, но работает для вектора, а также данные. Crame. (Частичные кредиты Frank Harrell)

clear.labels <- function(x) {
  if(is.list(x)) {
    for(i in 1 : length(x)) class(x[[i]]) <- setdiff(class(x[[i]]), 'labelled') 
    for(i in 1 : length(x)) attr(x[[i]],"label") <- NULL
  }
  else {
    class(x) <- setdiff(class(x), "labelled")
    attr(x, "label") <- NULL
  }
  return(x)
}

Используйте следующим образом:

my.unlabelled.df <- clear.labels(my.labelled.df)

Вы можете попробовать read.spss Функция от foreign упаковка.

Грубый и готовый способ избавиться от labelled класс создан spss.get

for (i in 1:ncol(x)) {
    z<-class(x[[i]])
    if (z[[1]]=='labelled'){
       class(x[[i]])<-z[-1]
       attr(x[[i]],'label')<-NULL
    }
}

Но вы можете дать пример, где labelled вызывает проблемы?

Если у меня есть переменная MAED В рамках данных x создан spss.get, У меня есть:

> class(x$MAED)
[1] "labelled" "factor"  
> is.factor(x$MAED)
[1] TRUE

Настолько хорошо написанный код, который ожидает, что фактор (говорит), не должен иметь никаких проблем.

Ну, я понял, что unclass Функция может быть использована для удаления классов (кто бы сказал, AYE?!):

library(Hmisc)
# let's presuppose that variable x is gathered through spss.get() function
# and that x is factor
> class(x)
[1] "labelled" "factor"
> foo <- unclass(x)
> class(foo)
[1] "integer"

Это не самое счастливое решение, просто представьте себе обратно-преобразование векторов ... Если кто-то вернет это, я проверю его как ответ ...

Предполагать:

library(Hmisc)
w <- spss.get('...')

Вы можете удалить этикетки переменной под названием «VAR1» с помощью:

attributes(w$var1)$label <- NULL

Если вы также хотите удалить класс «Labbled», вы можете сделать:

class(w$var1) <- NULL 

или если переменная имеет более одного класса:

class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")]

Надеюсь это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top