移除附加在 foreignHmisc SPSS导入函数上的变量标签。

问题描述 投票:9回答:5

像往常一样,我得到了一些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,也不屑于安装它)!

谢谢!

class r import label spss
5个回答
4
投票

你可以用参数避免在spss.get中创建 "标签化 "变量。, use.value.label=FALSE。

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

Bhattacharya的代码可能会失败,如果标签向量的类是简单的 "labelelled",而不是c("labelelled","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

13
投票

下面是我如何完全消除标签的方法. 类似于 Jyotirmoy 的解决方案,但既适用于向量,也适用于 data.frame。(部分归功于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)

编辑:

这是一个比较简洁的函数版本,结果一样。

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

2
投票

你可以试试 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

所以,写得好的代码,期待一个因子(比如) 应该不会有任何问题。


0
投票

嗯,我发现 unclass 函数可以用来删除类(谁会说呢,啊?)。

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"

这并不是最幸运的解决方案, 想象一下要对一堆向量进行反向转换... ... 如果有谁能顶上这个,我就把它作为答案来查....


0
投票

假设。

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")]

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.