从R数据帧的行中提取JSON数据

从R数据帧的行中提取JSON数据,json,r,dplyr,sapply,Json,R,Dplyr,Sapply,我有一个数据框,其中列参数的值是Json数据: # Parameters #1 {"a":0,"b":[10.2,11.5,22.1]} #2 {"a":3,"b":[4.0,6.2,-3.3]} ... 我想提取每行的参数,并将它们作为列A、B1、B2和B3附加到数据帧中 我怎么做 如果可能且高效的话,我宁愿使用dplyr。在您的示例数据中,每一行都包含一个json对象。这种格式称为aka,jsonlite包有一个特殊的函数流_in,用于将此类数据解析为数据帧: # Example dat

我有一个数据框,其中列参数的值是Json数据:

#  Parameters
#1 {"a":0,"b":[10.2,11.5,22.1]}
#2 {"a":3,"b":[4.0,6.2,-3.3]}
...
我想提取每行的参数,并将它们作为列A、B1、B2和B3附加到数据帧中

我怎么做


如果可能且高效的话,我宁愿使用dplyr。

在您的示例数据中,每一行都包含一个json对象。这种格式称为aka,jsonlite包有一个特殊的函数流_in,用于将此类数据解析为数据帧:

# Example data
mydata <- data.frame(parameters = c(
  '{"a":0,"b":[10.2,11.5,22.1]}',
  '{"a":3,"b":[4.0,6.2,-3.3]}'
), stringsAsFactors = FALSE)

# Parse json lines
res <- jsonlite::stream_in(textConnection(mydata$parameters))

# Extract columns
a <- res$a
b1 <- sapply(res$b, "[", 1)
b2 <- sapply(res$b, "[", 2)
b3 <- sapply(res$b, "[", 3)

在您的示例中,json结构相当简单,因此其他建议也适用,但此解决方案将推广到更复杂的json结构。

我实际上遇到了一个类似的问题,在一个数据帧中有多个变量是json对象,其中许多是NA的,但我不想删除存在NA的行。我编写了一个函数,它传递一个数据帧,数据帧中的id通常是记录id,变量名用引号引起来进行解析。该函数将创建两个子集,一个用于包含JSON对象的记录,另一个用于跟踪同一变量的NA值记录,然后将这些数据帧合并到原始数据帧,从而替换前一个变量。也许它会帮助你或其他人,因为它已经为我在一些情况下,现在工作。我还没有真正清理它太多,所以我道歉,如果我的变量名有点混乱,以及这是一个非常特别的功能,我写的工作。我还应该指出,我确实使用了另一个海报的想法,用从JSON对象创建的新变量替换前一个变量。你可以在这里找到:

最后一点注意:有一个名为tidyjson的包,它本来可以有一个更简单的解决方案,但显然无法处理列表类型的JSON对象。至少这是我的解释

library(jsonlite)
library(stringr)
library(dplyr)

parse_var <- function(df,id, var) {
  m <- df[,var]
  p <- m[-which(is.na(m))]
  n <- df[,id]
  key <- n[-which(is.na(df[,var]))]

  #create df for rows which are NA
  key_na <- n[which(is.na(df[,var]))]
  q <- m[which(is.na(m))]
  parse_df_na <- data.frame(key_na,q,stringsAsFactors = FALSE)  

  #Parse JSON values and bind them together into a dataframe.
  p <- lapply(p,function(x){ 
    fromJSON(x) %>% data.frame(stringsAsFactors = FALSE)}) %>% bind_rows()
  #bind the record id's of the JSON values to the above JSON parsed dataframe and name the columns appropriately.
  parse_df <- data.frame(key,p,stringsAsFactors = FALSE)

## The new variables begin with a capital 'x' so I replace those with my former variables  name
  n <- names(parse_df) %>% str_replace('X',paste(var,".",sep = ""))
  n <- n[2:length(n)]
  colnames(parse_df) <- c(id,n)

  #join the dataframe for NA JSON values and the dataframe containing parsed JSON values, then remove the NA column,q.
  parse_df <- merge(parse_df,parse_df_na,by.x = id,by.y = 'key_na',all = TRUE)

#Remove the new column formed by the NA values#
  parse_df <- parse_df[,-which(names(parse_df) =='q')]

  ####Replace variable that is being parsed in dataframe with the new parsed and names values.######

  new_df <- data.frame(append(df,parse_df[,-which(names(parse_df) == id)],after = which(names(df) == var)),stringsAsFactors = FALSE)
  new_df <- new_df[,-which(names(new_df) == var)]
  return(new_df)
} 

@akrun是的,但我不知道如何将fromJSON应用到每一行,并将数据附加到数据框架中,如果您想提取数字部分librarystringr;do.callrbind,lapplystr_提取_alldf1$Parameters,'[0-9.]+',as.numeric,并将列命名为A,B1:B4libraryrjson;v=c'{a:0,b:[10.2,11.5,22.1]}','{a:3,b:[4.0,6.2,-3.3]}';拉普利夫,fromJSON@akrun难道不能使用fromJSON吗?它还可以提取字符串变量;v=c'{a:0,b:[10.2,11.5,22.1]}','{a:3,b:[4.0,6.2,-3.3]}';v1=lapplyv,来自JSON;data.frametsapplyv1,functiony lapplyy,functionx pastex,collapse=',“在60K条记录上,这比构造一个巨大的JSON字符串只快4到5秒&从JSONSPrintf'{%s}',pastesprintf'%s:%s',my_key,my_JSON_列,collapse=',一起解析la,这是大致预期的吗?尝试生成一个包含60M条记录的JSON字符串。