【问题标题】:Haven: read_dta error() "Failed to parse /Users/folder/my_data.dta: Unable to allocate memory."避风港:read_dta 错误()“无法解析 /Users/folder/my_data.dta:无法分配内存。”
【发布时间】:2021-03-26 00:50:26
【问题描述】:

我有一个相对较大的.dta 文件,包含 1280000 个观察值,在 Stata 中运行良好,但我在将其导入 R 时遇到了麻烦。 数据是用Stata 15创建的,数据包含strL或str#,#>244个变量,不能保存为Stata 12格式。

我正在尝试使用 haven 包通过 read_dta() 导入保存的数据,但它给了我以下错误消息:"Failed to parse /Users/folder/my_data.dta: Unable to allocate memory." 有谁知道可能导致此问题的原因以及如何克服它以便能够在 R 中导入数据?

我尝试了多种方式来解决这个问题,但我的尝试似乎都没有奏效。

  1. 首先我尝试使用Sys.setenv('R_MAX_VSIZE'=32000000000) 扩展我的 r 环境的内存大小,但是当我尝试导入数据时控制台报告了相同的错误。这个问题似乎与我在 R 中的内存大小无关。

  2. 我尝试在 Stata 中使用 saveold my_data13, version(13) 以 Stata 13 格式保存数据,但尝试使用 haven 将其导入 R 仍然会产生相同的错误消息。

  3. 我尝试使用 readstata13 函数 read.dta13(my_data13),但这经常导致 R 崩溃。

奇怪的是我可以在Stata中正确打开数据,只需双击它。

有人对如何解决这个问题有任何建议吗?任何关于 a) 错误消息的含义以及如何解决它 2) 能够操作 stata15 文件的替代包 c) 能够在 R 中打开数据的方法的任何见解都将受到欢迎。

非常感谢您的帮助

最好的问候

【问题讨论】:

  • 如果任何解决方法都失败了,那么在 Stata 中导出到另一种文件类型(如 csv),然后使用 csv 文件在 R 中导入呢?
  • 我同意@Wouter 的观点,即您可以将文件导出为 CSV 之类的文件,尽管鉴于您正在使用的 URL 结构,我可以预见到一些困难。另一种方法是尝试 import the .dta file it into Python 然后从 Python export it to R
  • 亲爱的 Alvaro,非常感谢您的洞察力,不幸的是,正如您预测的那样,我在导出到 csv 文件时遇到问题,因为长字符串被 csv 文件错误地存储并重新打开它会产生更多问题。我会尝试使用 python 选项,但遗憾的是在 R 中没有直接的方法可以做到这一点
  • 所以我能够访问原始 CSV 文件,我已将其导入 R,然后尝试使用 write_dta(aparm_f,"data.dta") 存储它,我收到以下错误 Writing failure: A provided string value was longer than the available storage size of the specified column.两个问题有关系吗?
  • 亲爱的@ÁlvaroA.GutiérrezVargas,非常感谢您的回复。事实上,我担心这个问题与我的两个字符串最多有 4200 个字符有关。如果没有人能够提供有关如何在 R 中导入此类具有长字符串的 .dta 文件的见解,则使用 cvs 可能是最佳选择。

标签: r export stata r-haven


【解决方案1】:

我只想总结一下 cmets 中提到的所有内容。

official Stata documentation,我们有以下内容:

strL 变量的长度可以是 0 到 20 亿字节。 strL 变量的长度不需要超过 2,045 字节。 str# 变量最多可以存储 2,045 字节的字符串,因此 strL 和 str# 重叠。这种重叠相当于数字类型 int 和 float 的重叠。任何可以存储为 int 的数字都可以存储为 float。类似地,任何可以存储为 str# 的字符串都可以存储为 strL。反过来是不正确的。此外,strL 变量可以保存二进制字符串,而 str# 变量只能保存文本字符串。因此 str#/strL 和 int/float 之间的类比是准确的。有时您会希望使用 strL 变量而不是 str# 变量,就像有时您希望使用 float 变量而不是 int 变量一样。

以上信息让我在尝试复制您的问题之前推断出两点。

  1. 在您的情况下,没有必要使用strL

  2. strL 的使用是问题的根源,可能导致与 haven 库的兼容性问题。

但是,在尝试复制您所描述的内容后,我得出了不同的结论。


请仔细考虑以下模拟您的问题的代码。

version 16
clear all 
set obs 1
*4200 character string generated here: http://www.unit-conversion.info/texttools/random-string-generator/
gen strL str_var_in_strL = "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"

describe

Contains data
  obs:             1                          
 vars:             1                          
------------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
------------------------------------------------------------------------------------
str_var_in_strL strL    %9s                   
------------------------------------------------------------------------------------

save "route\all_in_strL" , replace

之后,我将您的修改应用于我生成的数据。

gen var1 = str_var_in_strL

foreach var of varlist var1 {
     generate str `var'_str = `var' 
     replace `var' = "" 
     compress `var' 
     replace `var' = `var'_str  
     drop `var'_str  
     describe `var' 
}

  obs:             1                          
 vars:             2                          16 Dec 2020 12:07
------------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
------------------------------------------------------------------------------------
str_var_in_strL strL    %9s                   
var1            strL    %9s                   
------------------------------------------------------------------------------------

save "route\edited_strL" , replace 

奇怪的是,我能够使用 haven 库和以下代码将这两个文件导入 R。

library(haven)
file <- "route_to_first_file/all_in_strL.dta"
# Import first file into R.

dta_in_R <- read_dta(
                    file,
                    encoding = NULL,
                    col_select = NULL,
                    skip = 0,
                    n_max = Inf,
                    .name_repair = "unique")



# Import edited file using your loop method into R.
file <- "route_to_edited_file/edited_strL.dta"

edited_dta_in_R<- read_dta(
                          file,
                          encoding = NULL,
                          col_select = NULL,
                          skip = 0,
                          n_max = Inf,
                          .name_repair = "unique")


这里唯一的区别可能是:

  1. 数据集的大小(在我的例子中只是一个观察结果)。
  2. 您可能使用的是较早版本的 Stata(我使用的是 Stata 16)。

最后,我认为问题的根源不是 strL 类型的数据,而是您机器上的可用内存,这可能通过您描述的 for 循环中的 compress 步骤解决。


PS:一切都是在Win10上运行的。 R 版本 4.0.3 (2020-10-10) 和haven_2.3.1

【讨论】:

  • 干得好。请检查我的编辑是否改变了您的预期含义。
  • 改版后含义不变。感谢@NickCox 的更正。
  • FWIW,我遇到了这个问题,通过运行compress 解决了这个问题,然后保存在 stata 中。关于拥有 strL 数据的一些事情。这不是系统内存问题。
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 2015-03-26
  • 2017-12-07
  • 2016-04-17
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多