在R中写入SAS XPORT文件,指定长度大于字符变量

时间:2018-01-22 21:12:48

标签: r sas

如何将R数据帧写入SAS xpt格式并指定每列的长度?例如,在一列文本变量中,最长的字符串是157个字符,但是我喜欢字段长度属性有200个字符。

软件包haven似乎没有此选项,并且软件包SASxport的文档在此问题上不太明确。

1 个答案:

答案 0 :(得分:3)

SASformat()SASiformat()函数用于在R对象上设置属性,该对象在写入SAS xport文件时设置其格式。要将数据框列设置为200个字符的格式,请使用以下方法:

SASformat(mydata$var) <- 'CHAR200.'`
SASiformat(mydata$var) <- 'CHAR200.'`

然后使用write.xport()将数据帧写入SAS xport格式。

有关详细信息,请参阅SASxport package文档的第17页。

SASxport是旧版程序包,因此您需要加载较早版本的Hmisc才能使其正常工作,而另一个SO question

但是,在将文件读入SAS时,无论格式和信息属性如何,它都会使用任何观察中最长字符串的长度来设置列的长度。因此,必须将至少一个包含尾随空白的观察写入所需长度,以便SAS将长度设置为所需的大小。具有讽刺意味的是,这使得格式和信息变得多余。

这可以使用str_c()包中的stringr函数来完成。

全部放在一起......

library("devtools")
install_version("Hmisc", version = "3.17-2")
library(SASxport)
library(Hmisc)
## manually create a data set
data <- data.frame( x=c(1, 2, NA, NA ), y=c('a', 'B', NA, '*' ), z=c("this is a test","line 2","another text string",
    "bottom line") )

# workaround - extend the string variable to desired length (30 characters) by 
# adding trailing blanks, using stringr::str_c() function 
library(stringr)
data$z <- sapply(data$z,function(x){str_c(x,str_dup(" ",30-nchar(x)),collapse=TRUE)})
nchar(data$z)

# write to SAS XPORT file
tmp <- tempfile(fileext = ".dat")
write.xport( data, file = tmp )

我们会将文件读入SAS并使用lengthc()检查z列的大小。

libname testlib xport '/folders/myfolders/xport.dat';
proc copy in=testlib out=work;
run;

data data;
   set data;
   lenZ = lengthc(z);
   run;

...和输出:

enter image description here