Прочитать информацию c из файла. json в R - PullRequest
1 голос
/ 07 апреля 2020

У меня есть несколько тысяч. json файлов с информацией об анализе настроений в каждом файле. Существует файл для каждого идентификатора. Я хочу перенести определенную информацию из файла. 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 файл.

В столбце «Имя» я хочу получить информацию go.

Я попробовал следующее (надеюсь, это имеет немного больше смысла относительно того, что я пытаюсь сделать):

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 file example

1 Ответ

0 голосов
/ 07 апреля 2020

Боюсь, ваш вопрос слишком сложен, чтобы на него точно ответить. Я постараюсь извлечь основную часть. Из того, что я понимаю, вы смогли прочитать ваши json файлы, но не ясно, какие именно у вас проблемы.

предположим, что вы прочитали следующую строку json.

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

Вы получите следующий список ##> file ## $ employee ## $ employee [[1]] ## $ employee [[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]] даст мне список сотрудников. Затем нам нужно go просмотреть этот список, чтобы извлечь фамилии каждого сотрудника. Мы можем достичь этой мысли 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...