假设我的工作目录中有一组类型为T1,T2 ... TN的.JSON文件,并且每种类型都有不同数量(n)的文件。每个.JSON文件都是数据帧列表。
阅读这些内容很简单:
library(jsonlite)
T1_l <- lapply(list.files(pattern = "T1"), fromJSON, flatten = TRUE)
T2_l <- lapply(list.files(pattern = "T2"), fromJSON, flatten = TRUE)
.
.
.
TN_l <- lapply(list.files(pattern = "TN"), fromJSON, flatten = TRUE)
我可以通过以下方式对我想要的内容(这只是每个列表中的数据帧)进行子集化:
T1_c <- lapply(T1_l, function(x) {x$content})
T2_c <- lapply(T2_l, function(x) {x$content})
.
.
.
TN_c <- lapply(TN_l, function(x) {x$content})
然后我可以通过以下方式将此内容绑定到单个数据框中:
library(dplyr)
T1_df <- bind_rows(T1_c)
T2_df <- bind_rows(T2_c)
.
.
.
TN_df <- bind_rows(TN_c)
如果我有100个或1000个这些.JSON文件类型,则此工作流程需要一个函数。但是为了简单起见,我想要一个自动执行此过程的函数,并将一组数据帧(名为T1_df,T2_df ... TN_df)输出到我的全局环境中。非常感谢任何帮助。
答案 0 :(得分:1)
只需扩展绑定数据框的lapply
函数:
# BASE R: IF COLUMNS ARE SAME
T1 <- do.call(rbind, lapply(list.files(pattern = "T1"), function(j)
fromJSON(j, flatten = TRUE)$content))
# DPLYR: IF COLUMNS DIFFER
T1 <- bind_rows(lapply(list.files(pattern = "T1"), function(j)
fromJSON(j, flatten = TRUE)$content))
要捕获数据框列表中的每个绑定数据帧,请使用嵌套的lapply
:
t_list <- c("T1", "T2", ..., "TN")
df_list <- lapply(t_list, function(t)
do.call(rbind, lapply(list.files(pattern = t), function(j)
fromJSON(j, flatten = TRUE)[['content']])))
甚至为每个df元素命名,然后将各个数据帧作为单独的对象输出到全局环境中(尽管如果有数百个dfs则不建议):
df_list <- setNames(df_list, t_list)
list2env(df_list, envir=.GlobalEnv)
答案 1 :(得分:0)
我真的在寻找一个功能,将整个过程包装成几行紧凑的代码。谢谢@Parafit - 此功能基于您的答案。
此函数采用文件模式向量,使用该模式读取.JSON文件,提取内容,并将数据框中特定模式的文件绑定在一起。
files_to_df <- function(pattern){
bind_rows(lapply(list.files(pattern = pattern), function(j)
fromJSON(j, flatten = TRUE)$content))
}
要应用于函数的模式
patterns <- c('abstracts', 'people', 'sessions', 'slots', 'rooms')
在这里,我们将patterns
应用于files_to_df
函数,将数据框的名称设置为pattern
中的名称,然后将这些数据框导出到全局环境
list2env(setNames(lapply(patterns, files_to_df), patterns), envir = .GlobalEnv)