إزالة الملصقات المتغيرة المرفقة مع وظائف استيراد SPSS أجنبية/HMISC

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. كيف أقوم بذلك؟ هل هذا ممكن على الإطلاق؟ إذا لم يكن كذلك ، فما هي خياراتي الأخرى؟

أريد حقًا تجاوز متغيرات إعادة تقديم "من الصفر" 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 (" المسمى "،" Factor ") في هذه الحالة كان ينبغي أن يكون:

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 ولكنه يعمل مع ناقل وكذلك بيانات. (ائتمانات جزئية لفرانك هاريل)

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

إذا كنت تريد أيضًا إزالة الفصل "Labled" ، فيمكنك القيام بذلك:

class(w$var1) <- NULL 

أو إذا كان المتغير يحتوي على أكثر من فئة واحدة:

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

أتمنى أن يساعدك هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top