【问题标题】:Saving .dta: data frame with very long strings using R保存 .dta:使用 R 的带有很长字符串的数据框
【发布时间】:2021-04-23 17:06:20
【问题描述】:

我有一个包含多个变量的 df,其中一些是非常长的字符串,最多 4500 个字符。我想将此数据库导出为.dta 文件。

我尝试使用 Haven 的 write_dta() 函数保存它,但收到以下错误消息:Error in write_dta_(data, normalizePath(path, mustWork = FALSE), version = stata_file_format(version), : Writing failure: A provided string value was longer than the available storage size of the specified column.

这是一个问题的例子:

library(haven)

longFun <- function(n) {
  do.call(paste0, replicate(5000, sample(LETTERS, n, TRUE), FALSE))
}

longString <- data.frame(VeryveryveryveryveryveryveryveryveryveryVeryveryveryveryveryveryveryveryveryverylongname = longFun(1), stringsAsFactors = F)
write_dta(longString,"tst.dta")

我知道write_dta 在处理长字符串 (https://github.com/tidyverse/haven/issues/437) 时存在问题,一种可能性是修剪字符串 (Error in write_dta : A provided string value was longer than the available storage size of the specified column)。但我必须保留完整的字符串。

有没有办法使用 R 将带有长字符串的变量保存为 .dta 文件?

编辑: 我已经尝试过@jay.sf 建议的readstata13::save.dta13 选项,但这有两个问题:1) 无法管理 - 即它截断 - 超过 32-UTF 字符的长变量名,write_dta() 管理得很好。 2) 比write_dta() 慢很多。鉴于我必须保存一个非常大的数据集,这是一个相关的问题。

总之有没有其他方法可以让我

a) 保存为 .dta 一个带有很长字符串的 df

b) 保留原始变量名(长于 32-UTF 字符)

c) 以相对快速的方式执行此操作。

【问题讨论】:

    标签: r stata r-haven


    【解决方案1】:

    使用 readstata13 包中的save.dta13

    R:

    readstata13::save.dta13(longString, "tst.dta")
    

    状态:

    . use "V:\tst.dta" 
    . list
    
         +------------------------------------------------------------------------------------------------------+
         | V1                                                                                                   |
         |------------------------------------------------------------------------------------------------------|
      1. | GZSPZGLLKOQHETKURLPKQDTZWTNHLDJDUSAFAXHFMPKUDIZURKIFLWQSXSFBLTPBGBLJKTDYJCHZOPZCFYKIMLGTQGDKRNBGUI.. |
         +------------------------------------------------------------------------------------------------------+
    

    【讨论】:

    • 不幸的是,save.dta13 不起作用,因为 var 名称太长。有没有办法让save.dta13 接受更长的名称或使用另一个包?
    • @Alex 请详细说明“不起作用”
    • 它会产生以下错误:Varname to long. Resizing. Max size is 32. 它会在 32 个字符后剪切我的变量名。我已经编辑了这个问题,以便名称反映这个长度。问题是我有数百个名称很长的变量,我想保留它们的原始名称
    • @Alex 1. 这不是错误,而是他们正在被削减的消息,2. 您的要求似乎不是根据this Stata list entry可能。
    • 亲爱的@jay.sf 非常感谢您的回复。它们非常有用,可以帮助我非常接近我想要实现的目标。在第 1 点)你是对的,是警告而不是错误。对不起,不准确。在第 2 点)这不再正确。事实上,最近的 stata 版本管理长名称。 haven 的优点之一就是它允许保存长名称。事实上,下面的df longString &lt;- data.frame(VeryveryveryveryveryveryveryveryveryveryVeryveryveryveryveryveryveryveryveryverylongname = 1, stringsAsFactors = F)可以使用write_dta(longString,"tst.dta")保存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2019-12-24
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多