在R中读取json,其中包含许多不同级别的变量 问题

在R中读取json,其中包含许多不同级别的变量 问题,r,json,R,Json,您好,我正在尝试读取R中的Json数据。我需要一个数据框,用于下面可复制数据框中的所有变量,并在jsonData列中为所有级别的数据设置不同的列 我尝试了从jsonliste:fromJSON、展平、转换为dataframeif嵌套列表或listsif tibbles和bind_cols创建数据框架 问题是变量中的列表中有列表 可复制数据: 我尝试了来自的两个代码,但没有解决不同级别的不同变量问题: # reply from ttrodrigz x <- jsonLog$JsonData

您好,我正在尝试读取R中的Json数据。我需要一个数据框,用于下面可复制数据框中的所有变量,并在jsonData列中为所有级别的数据设置不同的列

我尝试了从jsonliste:fromJSON、展平、转换为dataframeif嵌套列表或listsif tibbles和bind_cols创建数据框架

问题是变量中的列表中有列表

可复制数据: 我尝试了来自的两个代码,但没有解决不同级别的不同变量问题:

# reply from ttrodrigz 
x <- jsonLog$JsonData[2]  %>%
  
  # make json, then make list
  fromJSON() %>%
  
  # remove classification level
  purrr::flatten() %>%
  
  # turn nested lists into dataframes
  map_if(is_list, as_tibble) %>%
    
  # bind_cols needs tibbles to be in lists
  map_if(is_tibble, list) %>%
  
  # creates nested dataframe
  bind_cols()
例如,对于cbind_allx中的第2行:error,参数2的长度必须是7,而不是1

对不起,这太乱了。但这是json的非结构化数据特性,对R来说很不幸。

试试这个:

我稍微修改了您的json_数据:请参阅代码注释。 我已经创建了两个数据帧df和df2,以便在RStudio中进行比较查看 _


您能给出一个预期输出的示例吗?jsonData的这部分是一个无效的片段…Australia\,\latitude\:-lat、\latitude\:long-lat和long是不被引用的。你不可能总是免费的取消嵌套。您需要使用基本的lappy或purrr包函数,迭代每一行,然后使用一些自定义的非测试代码。
# reply from ttrodrigz 
x <- jsonLog$JsonData[2]  %>%
  
  # make json, then make list
  fromJSON() %>%
  
  # remove classification level
  purrr::flatten() %>%
  
  # turn nested lists into dataframes
  map_if(is_list, as_tibble) %>%
    
  # bind_cols needs tibbles to be in lists
  map_if(is_tibble, list) %>%
  
  # creates nested dataframe
  bind_cols()
library(tidyverse)
library(jsonlite)

jsonId <- c(1214, 1194, 2032, 923, 4208, 4412, 37729, 136004, 7059, 1448,
            4074, 1614)


id <- c(34, 34, 34, 36, 34, 34, 47, 36, 36, 36, 37, 47)


category <- c("A", "A", "B", "B", "C", "C", "D", "D", "F", "F", "G", "G")

# I have slightly modified your JSON: quoted -long, lat, wrapped all in a pair of []
jsonData <- c("[{\"comments\":{\"data\":[{\"id\":\"id1\",\"created_time\":\"2017-04-19T08:22:40+0000\",\"message\":\"comment\",\"from\":{\"name\":\"name1\",\"id\":\"11\"},\"like_count\":1}],\"paging\":{\"cursors\":{\"before\":\"some_cursor1\",\"after\":\"some_cursor2\"}}},\"id\":\"id2\"}",
              "{\"comments\":{\"data\":[{\"id\":\"id2\",\"created_time\":\"2017-04-20T08:22:40+0000\",\"message\":\"comment\",\"from\":{\"name\":\"name2\",\"id\":\"21\"},\"like_count\":2}],\"paging\":{\"cursors\":{\"before\":\"some_cursor21\",\"after\":\"some_cursor22\"}}},\"id\":\"id22\"}",
              "{\"posts\":{\"data\":[{\"id\":\"4\",\"created_time\":\"2017-04-20T03:24:57+0000\",\"message\":\"Test - location check-in\",\"status_type\":\"mobile_status_update\",\"story\":\"some_story\",\"from\":{\"name\":\"name1\",\"id\":\"id1\"},\"place\":{\"id\":\"id1\",\"name\":\"The Irish\",\"location\":{\"city\":\"city\",\"country\":\"Australia\",\"latitude\":\"-lat\",\"longitude\":\"long\",\"state\":\"VIC\",\"street\":\"add\",\"zip\":\"zip\"}},\"likes\":{\"data\":[],\"summary\":{\"total_count\":0,\"can_like\":true,\"has_liked\":false}},\"comments\":{\"data\":[],\"summary\":{\"order\":\"chronological\",\"total_count\":0,\"can_comment\":true}}}],\"paging\":{\"previous\":\"some link\"}},\"id\":\"id1\"}",
              "{\"id\":\"4\"}", "{\"reactions\":{\"data\":[{\"id\":\"id1\",\"type\":\"LIKE\"}],\"paging\":{\"cursors\":{\"before\":\"before1\",\"after\":\"after1\"}}},\"id\":\"id1\"}",
              "{\"reactions\":{\"data\":[{\"id\":\"id2\",\"type\":\"LIKE\"}],\"paging\":{\"cursors\":{\"before\":\"before2\",\"after\":\"after2\"}}},\"id\":\"id2\"}",
              "[{\"battery\":\"Medium\",\"deviceVersion\":\"Flex 2\",\"features\":[],\"id\":\"id\",\"lastSyncTime\":\"2017-07-21T21:13:00.000\",\"mac\":\"num1\",\"type\":\"TRACKER\"}]",
              "[]", "{\"activities-minutesFairlyActive\":[{\"dateTime\":\"2017-10-12\",\"value\":\"0\"}]}",
              "{\"activities-minutesFairlyActive\":[{\"dateTime\":\"2017-05-08\",\"value\":\"43\"},{\"dateTime\":\"2017-05-09\",\"value\":\"9\"}]}",
              "{\"activities-minutesLightlyActive\":[{\"dateTime\":\"2017-07-20\",\"value\":\"85\"}]}",
              "{\"activities-minutesLightlyActive\":[{\"dateTime\":\"2017-04-12\",\"value\":\"127\"},{\"dateTime\":\"2017-04-13\",\"value\":\"211\"},{\"dateTime\":\"2017-04-14\",\"value\":\"270\"},{\"dateTime\":\"2017-04-15\",\"value\":\"263\"},{\"dateTime\":\"2017-04-16\",\"value\":\"259\"},{\"dateTime\":\"2017-04-17\",\"value\":\"181\"},{\"dateTime\":\"2017-04-18\",\"value\":\"72\"}]}]"
)
timestamp <- structure(c(1494205440, 1494119040, 1495328700, 1493773440, 1500958620,
                         1501563420, 1518584460, 1535864460, 1507870680, 1494378240, 1500613020,
                         1494551100), class = c("POSIXct", "POSIXt"), tzone = "UTC")


jsonData_p <- reduce( jsonData, str_c, sep=",") %>% fromJSON()

df <- data_frame(jsonId, id, category, timestamp)
df2 <- df
df2$jsonData <- jsonData_p
#df2$jsonData <- map(jsonData_p, unlist)     # alternative: remove keys