将.JSON文件作为列表列表

时间:2017-08-31 01:24:36

标签: json r dplyr

假设我的工作目录中有一组类型为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)输出到我的全局环境中。非常感谢任何帮助。

2 个答案:

答案 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)