Class 删除附加有外部/Hmisc SPSS导入功能的变量标签

Class 删除附加有外部/Hmisc SPSS导入功能的变量标签,class,r,import,label,spss,Class,R,Import,Label,Spss,像往常一样,我得到了一些SPSS文件,我用SPSS导入到R中。从Hmisc包中获取函数。我对标记的类感到烦恼,该类Hmisc::spss.get将添加到data.frame中的所有变量,因此希望删除它 当我试图运行ggplot或者甚至当我想做一些低级的分析时,labeled类会让我头疼!一种解决方案是从data.frame中的每个变量中删除标记的类。我该怎么做?那有可能吗?如果没有,我的其他选择是什么 我真的想用as.data.frame(lappy(x,as.numeric))和as.char

像往常一样,我得到了一些SPSS文件,我用
SPSS导入到R中。从
Hmisc
包中获取
函数。我对
标记的
类感到烦恼,该类
Hmisc::spss.get
将添加到
data.frame
中的所有变量,因此希望删除它

当我试图运行
ggplot
或者甚至当我想做一些低级的分析时,
labeled
类会让我头疼!一种解决方案是从
data.frame
中的每个变量中删除
标记的
类。我该怎么做?那有可能吗?如果没有,我的其他选择是什么

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


谢谢

您可以从
foreign
软件包中试用
read.spss
函数

这是一种摆脱由
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
    }
}

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

好吧,我发现
unclass
函数可以用来删除类(谁会说,是的?!):

库(Hmisc)
#让我们假设变量x是通过spss.get()函数收集的
#这个x是因子
>类别(x)
[1] 标记为“因子”
>foo类(foo)
[1] “整数”
这不是最幸运的解决方案,想象一下把一堆向量转换回来。。。如果有人超过了这一点,我将检查它作为一个答案…

您可以避免在spss中创建“标记”变量。使用参数:get,使用.value.labels=FALSE

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

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

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


clear.labels实际上,这种方法并没有删除
labeled
类。这里有一个错误:
类中的错误(x[[i]])它与我尝试的SPSS文件一起工作。你能链接到一个失败的示例文件吗?或者给出for(i in 1:ncol(x))print(class(x[[i]])的输出,其中x是导入的数据帧。是否尝试
sappy(x,class)
而不是使用循环?哦,不幸的是,我记不起我使用的是哪个数据文件。。。那是很久以前的事了……一个重要的例子是一个c(“标记的”,“因子”)类对象,我已经运行了你的代码,它对我很有用。但我也有一个问题。当使用类为
tbl_df
tbl
data.frame
data.frame
时,函数
is.list
显示
TRUE
的输出。你明白为什么输出会显示这一点吗?
data.frame
是一个列表,即使它的类不是显式的“list”。试试
is(data.frame())
,还有
is(tibble::tibble())
;我们可以说df和tibble都是“受限”列表。它们通常是矩形的(例外是df可以包含一个矩阵,这很奇怪),如果您查看
data.frame
的源代码,就会发现它是由列表组成的(例如
return(结构(list(),name=character(),row.names=row.names,class=“data.frame”)
w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate'))
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
library(Hmisc)
w <- spss.get('...')
attributes(w$var1)$label <- NULL
class(w$var1) <- NULL 
class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")]
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)
}