如何应用R列属性(来自SAS格式,通过rio的导入),如避风港中的as_factor?

时间:2018-03-28 22:31:51

标签: r sas format r-haven

我使用rio:

将SAS数据导入R中
library(rio)
r<-import("S:/MyFolder/MyData.sas7bdat", catalog_file = "S:/MyFolder/formatsforr.sas7bcat")  

这给了我的r,它有r $ Race列(存储原子值1,2,3和4),它有一个似乎存储我的Race格式的属性(0 =“All”,1 =“White “,...,8 =”未知“,......)。我想使用属性将r $ Race转换为一个因子。我想为很多专栏做这个。

如果我使用避风港,我本可以这样做:

library(haven)
h <- read_sas("S:/MyFolder/MyData.sas7bdat", "S:/MyFolder/formatsforr.sas7bcat")  
h$Race <- as_factor(h$Race)  # as_factor is a haven function that converts the column to a factor, using the format to label the factor values.

但as_factor因r而失败(使用rio创建的对象)。

我希望只使用rio,因为其他原因我们更喜欢使用rio。我正在尝试为我的卫生部门的其他程序员创建简单的示例。我想尽量减少他们需要学习和加载的软件包数量,这样我们就可以集中精力学习。

如果这有帮助: as_factor(r$Race)返回此信息:

  

UseMethod(“as_factor”)中的错误:    没有适用于'as_factor'的方法应用于类“c”('double','numeric')的对象“

str(r$Race)返回:

  

原子[1:7776] 1 2 3 4 1 2 3 4 1 2 ...    - attr(,“label”)= chr“Race(1 = W,2 = B,3 = NatAm / AKNat,4 = Asian / PacIs)”    - attr(,“format.sas”)= chr“POPEST199XRACE”    - attr(,“labels”)=命名数[1:10] 0 1 2 3 4 0 1 2 3 4    ..- attr(,“names”)= chr [1:10]“Total”“White”“Black”“American Indian or Alaska Native”......

str(h$Race)返回:

  

类'标记'原子[1:7776] 1 2 3 4 1 2 3 4 1 2 ...    ..- attr(,“label”)= chr“Race(1 = W,2 = B,3 = NatAm / AKNat,4 = Asian / PacIs)”    ..- attr(,“format.sas”)= chr“POPEST199XRACE”    ..- attr(,“labels”)=命名数[1:10] 0 1 2 3 4 0 1 2 3 4    .. ..- attr(,“names”)= chr [1:10]“Total”“White”“Black”“American Indian or Alaska Native”......

运行导入(...)后立即运行:

    dput(head(r$Race))# returns this: 
c(1, 2, 3, 4, 1, 2)

运行read_sas(...)后立即运行:

     dput(head(h$Race)) # returns this:
     structure( c(1, 2, 3, 4, 1, 2), 
       labels = structure(c(0, 1, 2, 3, 4, 0, 1, 2, 3, 4),
       .Names = c("Total", "White", "Black", "American Indian or Alaska Native", 
                "Asian or Pacific Islander", "Total", "White", "Black", 
                "American Indian or Alaska Native", "Asian or Pacific Islander")),
                   class = "labelled")

我没有找到在线.sas7bcat文件。我可以发布SAS代码来创建它和数据文件。

1 个答案:

答案 0 :(得分:0)

我放弃了尝试使用rio,而是使用了避风港。当使用import()调用catalog_file =时,rio可以在创建的R对象的属性中捕获SAS格式信息,但我无法弄清楚如何使用它们。通过查看避难所的as_factor函数,我看到有些复杂的逻辑避难所用来利用类似的属性(通过避难所的read_sas()函数创建)。看到它的复杂性,我没有试图模仿它来应用于rio导入对象的属性。