首页 > 解决方案 > 保存 .dta:使用 R 的带有很长字符串的数据框

问题描述

我有一个包含多个变量的 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),一种可能性是修剪字符串(write_dta 中的错误:提供的字符串值比可用存储长指定列的大小)。但对我来说,保留完整的字符串是必不可少的。

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

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

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

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

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

c) 以相对快速的方式进行。

标签: rstatar-haven

解决方案


save.dta13readstata13包中使用。

回复:

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

状态:

. use "V:\tst.dta" 
. list

     +------------------------------------------------------------------------------------------------------+
     | V1                                                                                                   |
     |------------------------------------------------------------------------------------------------------|
  1. | GZSPZGLLKOQHETKURLPKQDTZWTNHLDJDUSAFAXHFMPKUDIZURKIFLWQSXSFBLTPBGBLJKTDYJCHZOPZCFYKIMLGTQGDKRNBGUI.. |
     +------------------------------------------------------------------------------------------------------+

推荐阅读