如何从 RDATA 文件单独加载多个文件

问题描述 投票:0回答:1

我的办公室主要使用R进行数据分析,尽管我使用Python。少数人使用 Excel。我们的办公室每天使用一次数据提取来进行所有分析,因此如果我们得到不同的答案,我们知道这不是因为在不同时间访问数据库造成的。主要问题是我们将该数据保存为 .RData 文件,该文件只能在 R 中打开。

我正在努力将该数据文件转换为更通用的文件,例如 json 文件。这样python就可以轻松打开它,而且我相信如果使用powerquery什么的excel也可以打开它(我不怎么用excel来分析)。这将使我们办公室中的每个人都可以轻松访问它,而无需每次我们做某事时都使用多个程序。

我遇到的问题是,我找不到一种好方法来访问保存在 .rdata 文件中的每个单独项目并将其保存为 json 文件。看起来 .rdata 文件中保存了 56 个数据帧和变量,我想将每个数据帧转换为 json 文件。

如果有人有好的建议,我愿意接受其他格式,但就上下文而言,我们的 IT 部门完全无能,因此我们无法获得软件升级,并且我们无法自己加载 python 和 R 包。我们安装的 R 库无法处理 hdf5 或 parquet,并且我们安装的 python 包无法处理 parquet。我也不想完全搞砸 Excel 人员,尽管他们必须学习一些 R,所以它不需要需要可以在 Excel 中使用。

我已经尝试过了

test_import = 加载(我的数据) 打印(测试导入)

但到目前为止,我只能获取文件中的项目列表。

r rdata
1个回答
0
投票

可以想象,如果您只是加载 RDATA 文件并将列表中的每个数据帧写入 json 或任何其他格式,您可以执行类似的操作

library(tidyverse)

sim_data_frames = \(n = 100){
  tibble(
    x = rnorm(n),
    y = 0.5 * x + rnorm(n)
  )
}

data_list = replicate(56, sim_data_frames(), simplify = FALSE)


save(data_list, file = "data_list.RDATA")


load("data_list.RDATA")

names(data_list) = paste0("data_", 1:56)

names_vec = names(data_list)
dir.create("individual_data_files")

invisible(map2(data_list, names_vec, \(x,y) jsonlite::write_json(x, here::here("individual_data_files",
                                                               paste0(y, ".json")))))

invisible(map2(data_list, names_vec, \(x,y) xlsx::write.xlsx(x, here::here("individual_data_files",
                                                                   paste0(y, ".xlsx")))))

其中

map2
将迭代列表的每个元素和名称向量以保存 json 文件。如果有这样的混合信息

char_vec = "this is not a data frame" 

data_list2 = append(data_list, char_vec)

您可以使用

keep
来删除像这样的非数据框元素


data_list_saving = data_list2 |> 
  keep(\(x) is.data.frame(x))

length(data_list_saving) ; length(data_list)
#> [1] 56
#> [1] 56

创建于 2024-05-15,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.