如何将R数据帧写入SAS xpt格式并指定每列的长度?例如,在一列文本变量中,最长的字符串是157个字符,但是我喜欢字段长度属性有200个字符。
软件包haven
似乎没有此选项,并且软件包SASxport
的文档在此问题上不太明确。
答案 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;
...和输出: