0

我正在使用 Haven 的包命令“ read_sas ”将 sas 数据文件( .sas7bdat)及其相应格式(在 R 语言中称为“标签”)与(.sas7bcat )文件导入 R。在自己的工作中导入 sas 文件就好了。但是,当我尝试使用以下代码导入格式文件时,导入格式文件sas7bcat我收到以下错误消息:

pri <- read_sas (path = "Datasets/pri.sas7bdat",
                 path.cat = "Datasets/formats.sas7bcat")

df_parse_sas_file 中的错误(spec_data,spec_cat,encoding = encoding,catalog_encoding = catalog_encoding,无法解析 .../formats.sas7bcat:文件无效,或文件具有不受支持的功能。

我不知道问题出在哪里。我在 SAS 文件中有近 250 个变量,它们都有标签和格式(在 SAS 术语中)。

我已经阅读了与堆栈溢出问题相关的所有内容。我认为问题可能出在格式文件本身,但我无法弄清楚问题所在。

我正在使用最新版本的 Haven 2.3.1 : 和 R v. 4.0.3 (2020-10-10),在 Windows 10 上使用 RStudio v.1.3.1093。

此链接具有格式的 SAS 代码

此链接具有 .sas7bcat 库

4

1 回答 1

1
sessionInfo()
#> R version 4.0.4 (2021-02-15)
#> Platform: i386-w64-mingw32/i386 (32-bit)
#> Running under: Windows 10 x64 (build 17763)
#> 
#> other attached packages:
#> [1] haven_2.3.1

class我在 SAS 中创建了一个数据库:

data temp.class;
  set sashelp.class;
  if sex = "M" then sexnum = 1; else sexnum = 2;
  format sexnum sexfmt.;
run;

请注意,您的语法对我不起作用:

haven::read_sas (path = "d:/temp/class.sas7bdat", 
                 path.cat = "d:/temp/formats.sas7bcat")
#> Error in read_sas(path = "d:/temp/class.sas7bdat", path.cat = "d:/temp/formats.sas7bcat") : 
#>   unused arguments (path = "d:/temp/class.sas7bdat", path.cat = "d:/temp/formats.sas7bcat")

然后我使用了以下语法,得到了和你一样的信息:

haven::read_sas (data_file = "d:/temp/class.sas7bdat", 
                 catalog_file = "d:/temp/formats.sas7bcat")
#> Error in df_parse_sas_file(spec_data, spec_cat, encoding = encoding, catalog_encoding = catalog_encoding,  : 
#>   Failed to parse D:/temp/formats.sas7bcat: Invalid file, or file has unsupported features.

或者如果language for message设置为fr

haven::read_sas (data_file = "d:/temp/class.sas7bdat", 
                 catalog_file = "d:/temp/formats.sas7bcat")
#> Error in df_parse_sas_file(spec_data, spec_cat, encoding = encoding, catalog_encoding = catalog_encoding,  : 
#>   Failed to parse D:/temp/formats.sas7bcat: Unable to allocate memory.

这是由于rekof没有价值的格式。删除它没关系:

haven::read_sas (data_file = "d:/temp/class.sas7bdat", 
                 catalog_file = "d:/temp/formats.sas7bcat")
#> # A tibble: 19 x 6
#>    Name    Sex     Age Height Weight     sexnum
#>    <chr>   <chr> <dbl>  <dbl>  <dbl>  <dbl+lbl>
#>  1 Alfred  M        14   69    112.  1 [Male]  
#>  2 Alice   F        13   56.5   84   2 [Female]
#>  3 Barbara F        13   65.3   98   2 [Female]
#>  4 Carol   F        14   62.8  102.  2 [Female]
#>  5 Henry   M        14   63.5  102.  1 [Male]  
#>  6 James   M        12   57.3   83   1 [Male]  
#>  7 Jane    F        12   59.8   84.5 2 [Female]
#>  8 Janet   F        15   62.5  112.  2 [Female]
#>  9 Jeffrey M        13   62.5   84   1 [Male]  
#> 10 John    M        12   59     99.5 1 [Male]  
#> 11 Joyce   F        11   51.3   50.5 2 [Female]
#> 12 Judy    F        14   64.3   90   2 [Female]
#> 13 Louise  F        12   56.3   77   2 [Female]
#> 14 Mary    F        15   66.5  112   2 [Female]
#> 15 Philip  M        16   72    150   1 [Male]  
#> 16 Robert  M        12   64.8  128   1 [Male]  
#> 17 Ronald  M        15   67    133   1 [Male]  
#> 18 Thomas  M        11   57.5   85   1 [Male]  
#> 19 William M        15   66.5  112   1 [Male]  

要删除格式rekof,您可以:

  • 删除格式目录
  • 将该行注释为/* value rekof ; */
  • 重新生成格式目录(执行proc format

或使用以下 SAS 代码:

proc catalog catalog=lcoc.formats; 
  delete rekof (et=format);
run;

产生错误的最小示例

在 SAS

libname temp "d:/temp";
option fmtsearch=(temp);

proc format lib=temp;
  value test;
run;

data temp.class;
  set sashelp.class;
run;

在 R 中

haven::read_sas (data_file = "d:/temp/class.sas7bdat", 
                 catalog_file = "d:/temp/formats.sas7bcat")
#> Error in df_parse_sas_file(spec_data, spec_cat, encoding = encoding, catalog_encoding = catalog_encoding,  : 
#>   Failed to parse D:/temp/formats.sas7bcat: Unable to allocate memory.

问候,

于 2021-03-06T17:01:32.053 回答