首页 > 解决方案 > 从 R 中的 .json 文件中读取特定信息

问题描述

我有几千个 .json 文件,每个文件中都有情绪分析信息。每个 ID 都有一个文件。我想将 .json 文件中的某些信息带入 df。我的问题是每个文件通常有多个我感兴趣的信息。

例如:

    PetID Entities Count Name
1  p00001       13     1   NA
2  p00001       13     2   NA
3  p00001       13     3   NA
4  p00001       13     4   NA
5  p00001       13     5   NA
6  p00001       13     6   NA
7  p00001       13     7   NA
8  p00001       13     8   NA
9  p00001       13     9   NA
10 p00001       13    10   NA
11 p00001       13    11   NA
12 p00001       13    12   NA
13 p00001       13    13   NA
14 p00002        2     1   NA
15 p00002        2     2   NA
16 p00004        6     1   NA
17 p00004        6     2   NA
18 p00004        6     3   NA
19 p00004        6     4   NA
20 p00004        6     5   NA
21 p00004        6     6   NA
22 p00006        2     1   NA
23 p00006        2     2   NA

Entitites 是我想要从每个 ID .json 文件中获得的信息的数量。

“名称”列是我想要信息去的地方。

我尝试了以下方法(希望这对我正在尝试做的事情更有意义):

for(i in 1:nrow(df)){
    file <- df[,'PetID']
    count <- df[,'Count']
    name[i] <- file$entities[[df[,count[,i]]]$name
}

但这不起作用。(文件是 .json 文件名)

我本质上想要如下所示的东西:

 PetID Entities Count   Name
1  p00001       13     1  info1
2  p00001       13     2  info2
3  p00001       13     3  info3
4  p00001       13     4  info4
5  p00001       13     5  info5
6  p00001       13     6  info6
7  p00001       13     7  info7
8  p00001       13     8  info8
9  p00001       13     9  info9
10 p00001       13    10 info10
11 p00001       13    11 info11
12 p00001       13    12 info12
13 p00001       13    13 info13
14 p00002        2     1  info1
15 p00002        2     2  info2
16 p00004        6     1  info1
17 p00004        6     2  info2
18 p00004        6     3  info3
19 p00004        6     4  info4
20 p00004        6     5  info5
21 p00004        6     6  info6
22 p00006        2     1  info1
23 p00006        2     2  info2

如果这没有多大意义,很高兴提供更多信息。

提前致谢!

编辑 - 包括下面的 DF 代码

file_path <- getwd()
print(file_path)

file_list <- list.files(file_path, pattern = '*.json', full.names = FALSE)
head(file_list)

file_list_small <- file_list[1:4] # Just to simplify the process while trying to figure it out!
file_list_small

Pet_ID <- rep(0, length(file_list_small))
Pet_ID
entities_number <- rep(0, length(file_list_small))
entities_number

for(i in 1:length(file_list_small)) {
  Pet_ID[i] <- substr(file_list_small[i], 1, 6)
  file <- rjson::fromJSON(file = paste(Pet_ID[i], '.json', sep = ''))
  entities_number[i] <- nrow(summary(file$entities))
  max_entities <- sum(entities_number)
}

col1 <- Pet_ID
col2 <- entities_number
data <- data.frame(col1,col2)
data <- data[rep(1:nrow(data), data$col2),]
PetID_data <- data[,1]
entities_per <- data[,2]
data ; PetID_data ; entities_per

df <- data.frame(matrix(vector(), max_entities, 4,
         dimnames = list(c(), c('PetID', 'Entities', 'Count', 'Name'))),
         stringsAsFactors = TRUE)

df[,'PetID'] <- PetID_data
df[,'Entities'] <- entities_per
df[,'Count'] <- with(df, ave(seq_along(PetID), PetID, FUN = seq_along))
print(df)

我还附上了 .json 文件示例的屏幕截图 - 圈出的信息是我要提取的信息。

.json 文件示例

标签: rjson

解决方案


恐怕你的问题有点复杂,无法准确回答。我将尝试提取必要的部分。据我了解,您能够阅读您的 json 文件,但尚不清楚您的问题是什么。

假设您阅读了以下 json 字符串。

>  file <- rjson::fromJSON('{"employees":[
  { "firstName":"John", "lastName":"Doe" },
  { "firstName":"Anna", "lastName":"Smith" },
  { "firstName":"Peter", "lastName":"Jones" }
]}')

你会得到以下列表 ## > file ## $employees ## $employees[[1]] ## $employees[[1]]$firstName ## [1] "John"

## $employees[[1]]$lastName
## [1] "Doe"


## $employees[[2]]
## $employees[[2]]$firstName
## [1] "Anna"

## $employees[[2]]$lastName
## [1] "Smith"


## $employees[[3]]
## $employees[[3]]$firstName
## [1] "Peter"

## $employees[[3]]$lastName
## [1] "Jones"

然后假设我想从列表中提取员工的姓氏并将其放入data.frame. 首先我们来看一下结构file

## > str(file,2)
## List of 1
##  $ employees:List of 3
##   ..$ :List of 2
##   ..$ :List of 2
##   ..$ :List of 2

所以第一次提取file[[1]],会给我员工名单。然后我们需要通过这个列表来提取每个员工的姓氏。我们可以实现这个想法lapply

    ## > lapply(file[[1]],function(x) x$lastName)
## [[1]]
## [1] "Doe"

## [[2]]
## [1] "Smith"

## [[3]]
## [1] "Jones"

然后下一步是将其放入 data.frame

## > data.frame(cbind(id="PET",lapply(file[[1]],function(x) x$lastName)))
##    id    V2
## 1 PET   Doe
## 2 PET Smith
## 3 PET Jones

或者你可以做

 d <- data.frame(id=1:3)

## > d$lastname <- unlist(lapply(file[[1]],function(x) x$lastName))
## > d
##   id lastname
## 1  1      Doe
## 2  2    Smith
## 3  3    Jones

推荐阅读