代码之家  ›  专栏  ›  技术社区  ›  aL3xa

删除附加在foreign/Hmisc SPSS导入函数上的变量标签

  •  8
  • aL3xa  · 技术社区  · 16 年前

    像往常一样,我有一些SPSS文件,我已经导入到R spss.get 函数来自 Hmisc 包裹我受够了 labelled 那是什么 Hmisc::spss.get 添加到中的所有变量 data.frame ,因此要将其删除。

    贴标签于 ggplot 甚至当我想做一些卑微的分析的时候!一种解决办法是移除 从中的每个变量初始化 数据框

    我真的想绕过重新编辑变量“从头开始”与 as.data.frame(lapply(x, as.numeric)) as.character 如果适用。。。我当然不想运行SPSS并手动删除标签(不喜欢SPSS,也不想安装它)!

    谢谢

    5 回复  |  直到 16 年前
        1
  •  4
  •   IRTFM    15 年前

    您可以避免在spss.get中创建带有参数的“标签”变量:,use.value.labels=FALSE。

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

    如果标记向量的类只是“标记”而不是c(“标记”,“因子”),那么来自Bhattacharya的代码可能会失败,在这种情况下,它应该是:

    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
    
        2
  •  14
  •   Dominic Comtois    6 年前

    下面是我如何彻底摆脱标签的。类似于Jyotirmoy的解决方案,但适用于向量和data.frame(部分贷记弗兰克·哈雷尔)

    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)
    }
    
        3
  •  2
  •   Jyotirmoy Bhattacharya    16 年前

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

    贴标签于 导致问题?

    MAED 在数据帧中 x spss获取 ,我有:

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

    因此,期望某个因素(比如说)的编写良好的代码应该不会有任何问题。

        4
  •  1
  •   Emer    15 年前

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

    可以使用以下方法删除名为“var1”的变量的标签:

    attributes(w$var1)$label <- NULL
    

    class(w$var1) <- NULL 
    

    或者如果变量有多个类:

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

    希望这有帮助!

        5
  •  0
  •   aL3xa    16 年前

    我知道了 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"
    

    这不是最幸运的解决方案,想象一下把一堆向量转换回来。。。如果有人超过这个,我会检查它作为一个答案。。。

    推荐文章