【问题标题】:importing a SAS data set to R将 SAS 数据集导入 R
【发布时间】:2020-12-16 00:38:41
【问题描述】:

我正在尝试将 SAS 数据集导入 R(我无法共享数据集)。 SAS 将列视为数字或字符。但是,某些数字列具有编码字符值。我使用 sas7bdat 包来引入数据集,但数字列中的那些字符值返回 NaN。我想要实际的字符值。我尝试将数据集导出为 csv 和制表符分隔的文件。但是,我最终得到的观察结果需要 2 行(SAS 的一个问题,我无法弄清楚)。由于有超过 9000 个观察值,我无法返回并寻找那些手动占用 2 行的观察值。有什么想法可以解决这个问题吗?

【问题讨论】:

  • 我知道您不能分享您的生产数据,但您可以分享一些重现您的问题的假样本数据。没有这些,将很难得到有效的答案...
  • 虽然我不知道它们能提供多大帮助(因为您无法共享数据),但在 SO 中搜索 [r] [sas] import 会产生几个有希望的链接,包括 stackoverflow.com/questions/33421854/…。缺少这一点,即使您不能共享 那个 数据(可能有 72M 行和 36k 列),您也可以使用假数据来模仿您拥有的数据,可能是 7 行和 4 列......看看我们能做什么。只是数字和字母,请仔细模仿。

标签: r csv import sas


【解决方案1】:

处理多行数据的部分答案

library( data.table )
#first, read the whole lines into a single colunm, for example with
DT <- data.table::fread( myfile, sep = "")

#sample data for this example: a data.table with ten rows containing the numbers 1 to 10
DT <- data.table( 1:10 )

#column-bind wo subsets of the data, using a logical vector to select the evenery first 
#and every second row. then paste the colums together and collapse using a 
#comma-separator (of whatever separator you like)
ans <- as.data.table(
  cbind ( DT[ rep( c(TRUE, FALSE), length = .N), 1], 
          DT[ rep( c(FALSE, TRUE), length = .N), 1] )[, do.call( paste, c(.SD, sep = ","))] )

#      V1
# 1:  1,2
# 2:  3,4
# 3:  5,6
# 4:  7,8
# 5: 9,10

【讨论】:

    【解决方案2】:

    SAS 不在数字列中存储字符值。但是有一些方法可以使用字符打印数值。

    首先是如果您使用的是 BEST 格式(这是数字变量的默认格式)。如果该值不能准确地用字符数表示,那么它将使用科学计数法。

    其次是特殊的缺失值。 SAS 有 28 个缺失值。定期缺失由句点表示。其他的使用单个字母或下划线。

    第三种是使用字母显示数字的自定义格式。

    第一个在导入R时应该不会造成任何麻烦。最后两个可以由Haven处理。请参阅文档中的语义 Vignette。

    对于您的多行 CSV 文件,可能存在两个问题。首先是您没有告诉 SAS 为您的数据使用足够长的行。只需确保在您正在写入的文件上使用更长的 LRECL 设置即可。

    filename csv 'myfile.csv' lrecl=1000000 ;
    proc export data=mydata file=csv dbms=csv ; run;
    

    第二个可能的问题是您的某些字符变量中包含行尾字符。最好只删除或替换这些字符。如果真的需要,您可以随时将它们添加回来。例如,这些步骤将导出与上述相同的文件。它将首先将字符变量中的回车和换行符替换为管道字符。

    data for_export ;
       set mydata;
       array _c _character_;
       do over _c;
         _c = translate(_c,'||','0A0D'x);
       end;
    run;
    proc export data=for_export file=csv dbms=csv ; run;   
    

    【讨论】:

      【解决方案3】:

      我更喜欢 'haven' 包中的 read_sas 函数来读取 sas 数据

      library(haven)
      data <- read_sas("data.sas7bdat")
      

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 2011-06-26
        • 1970-01-01
        • 2012-07-15
        • 2016-02-16
        • 1970-01-01
        • 2015-07-12
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多