1

所以在过去的一个小时左右,我一直在尝试获取字符向量的一个子集。在我(挣扎)尝试让这个工作时,我遇到了 R 的一个有趣特征。我有数据(在 JSON 解析之后),形式为

[[1]]
[[1]]$business_id
[1] "rncjoVoEFUJGCUoC1JgnUA"

[[1]]$full_address
[1] "8466 W Peoria Ave\nSte 6\nPeoria, AZ 85345"

[[1]]$open
[1] TRUE

[[1]]$categories
[1] "Accountants"           "Professional Services" "Tax Services"         
[4] "Financial Services"   

[[1]]$city
[1] "Peoria"

[[1]]$review_count
[1] 3

[[1]]$name
[1] "Peoria Income Tax Service"

[[1]]$neighborhoods
list()

[[1]]$longitude
[1] -112.2416

[[1]]$state
[1] "AZ"

[[1]]$stars
[1] 5

[[1]]$latitude
[1] 33.58187

[[1]]$type
[1] "business"

这是我正在使用的代码

#!/usr/bin/Rscript

require(graphics)
require(RJSONIO)

parsed_data <- lapply(readLines("yelp_phoenix_academic_dataset/yelp_academic_dataset_business.json"), fromJSON)

#parsed_data[,c("categories")]
print(parsed_data[1])

当我试图删除除类别列之外的所有内容时,我遇到了这种有趣的行为

print(parsed_data[1])
print(parsed_data[1][1])
print(parsed_data[1][1][1][1][1][1])

都产生相同的输出(上面发布的那个)。这是为什么?

4

2 回答 2

4

[这就是和之间的区别[[。很难在网上搜索这些,但?'['会带来帮助。

使用 索引列表时[,将返回一个列表:

list(a=1:10, b=11:20)[1]
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

这是一个元素的列表,因此再次重复该操作会产生相同的值:

list(a=1:10, b=11:20)[1][1]
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

[[返回元素,而不是包含该元素的列表。它也只接受一个索引(而[接受一个向量):

list(a=1:10, b=11:20)[[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10

而且这个操作在列表上不是幂等的:

list(a=1:10, b=11:20)[[1]][[1]]
## [1] 1
于 2013-05-24T02:50:54.030 回答
2

您的 JSON 数据当前存储在列表中,而不是向量中,因此索引不同。

正如 Matthew 所指出的,使用 [] 访问元素和使用 [[]] 是有区别的。有关此问题的讨论,我将向您推荐此堆栈溢出线程:

在 R 中,访问列表元素的 [] 和 [[]] 符号有什么区别?

查看打印出的数据,您的数据存储为嵌套列表:

parsed_data[[1]]

会给你一个包含每一列的列表。要访问类别列,您可以使用以下任何一项:

parsed_data[[1]][["categories"]]
parsed_data[[1]][[4]]
parsed_data[[1]]$categories

这将为您提供您期望的名称向量:

## [1] "Accountants"           "Professional Services" "Tax Services"
## [4] "Financial Services"  

请注意,当按索引(命名或数字)访问时,您仍然必须使用双括号表示法:[[]]。如果你使用 [] 代替,它会给你一个列表而不是一个向量:

parsed_data[[1]]["categories"]
## [[1]]
##   [1] "Accountants"           "Professional Services" "Tax Services"
##   [4] "Financial Services"  
于 2013-05-24T03:12:58.157 回答