10

像往常一样,我得到了一些 SPSS 文件,这些文件已使用包中的spss.get函数导入到 R 中Hmisc。我对添加到所有变量的labelled类感到困扰,因此想删除它。Hmisc::spss.getdata.frame

labelled当我尝试跑步ggplot时,甚至当我想做一些琐碎的分析时,课堂让我头疼!一种解决方案是labelleddata.frame. 我怎样才能做到这一点?这有可能吗?如果没有,我的其他选择是什么?

我真的很想绕过“从头开始”重新编辑变量,as.data.frame(lapply(x, as.numeric))as.character在适用的情况下......而且我当然不想手动运行 SPSS 和删除标签(不喜欢 SPSS,也不关心安装它)!

谢谢!

4

5 回答 5

15

这是我完全摆脱标签的方法。类似于 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)
}
于 2014-06-05T22:04:59.420 回答
4

您可以避免在 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
于 2010-12-29T02:16:07.433 回答
2

您可以从包中试用该read.spss功能。foreign

摆脱labelledspss.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的数据框中有一个变量,我有:xspss.get

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

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

于 2010-03-07T10:24:19.707 回答
1

认为:

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

希望这可以帮助!

于 2011-03-09T19:42:16.910 回答
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"

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

于 2010-03-10T20:01:31.240 回答