r - 从 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 文件,但尚不清楚您的问题是什么。
假设您阅读了以下 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
推荐阅读
- directus - 无法访问directus的安装页面
- java - SpEL 语言 - 自动空引用初始化
- kivy - 只旋转图像而不是矩阵
- java - 有没有办法让 gecko.driver 在共享代码中对每个人都可用?
- excel - 使用数据验证和条件格式的逻辑在表中插入第一行
- c - C中嵌套for循环中的条件不起作用
- arrays - 如何在 sting 数组中附加 Json 值?
- python - sklearn.preprocessing.normalize 如何规范化数据,我可以在新数据上复制均值和标准差吗?
- python - 如何以 Python 方式在 MatLab 中解压二进制数据
- django - 如何在 DRF 中为 GET 添加序列化器字段而不是 POST?