1
data.frame我有以下代码,其中从JSON文件中提取数据。“嵌入”从JSON
library(jsonlite)
file_path <- 'C:/some/file/path.json'
df <- jsonlite::fromJSON(txt = file_path ,
simplifyVector = FALSE,
simplifyDataFrame = TRUE,
simplifyMatrix = FALSE,
flatten = FALSE)
数据结构是高度嵌套的。我的方法提取99%的它只是罚款,但在数据的一个特定部分我碰到,我会形容为“嵌入式”的数据帧的现象传来:
df <- structure(
list(
ID = c(1L, 2L, 3L, 4L, 5L),
var1 = c('a', 'b', 'c', 'd', 'e'),
var2 = structure(
list(
var2a = c('v', 'w', 'x', 'y', 'z'),
var2b = c('vv', 'ww', 'xx', 'yy', 'zz')),
.Names = c('var2a', 'var2b'),
row.names = c(NA, 5L),
class = 'data.frame'),
var3 = c('aa', 'bb', 'cc', 'dd', 'ee')),
.Names = c('ID', 'var1', 'var2', 'var3'),
row.names = c(NA, 5L),
class = 'data.frame')
# Looks like this:
# ID var1 var2.var2a var2.var2b var3
# 1 1 a v vv aa
# 2 2 b w ww bb
# 3 3 c x xx cc
# 4 4 d y yy dd
# 5 5 e z zz ee
这看起来像一个正常的数据框架,它的行为就像大部分。
class(df)
# [1] "data.frame"
df[1,]
# ID var1 var2.var2a var2.var2b var3
# 1 a v vv aa
dim(df)
# [1] 5 4
# One less than expected due to embedded data frame
lapply(df, class)
# $ID
# [1] "integer"
#
# $var1
# [1] "character"
#
# $var2
# [1] "data.frame"
#
# $var3
# [1] "character"
str(df)
# 'data.frame': 5 obs. of 4 variables:
# $ ID : int 1 2 3 4 5
# $ var1: chr "a" "b" "c" "d" ...
# $ var2:'data.frame': 5 obs. of 2 variables:
# ..$ var2a: chr "v" "w" "x" "y" ...
# ..$ var2b: chr "vv" "ww" "xx" "yy" ...
# $ var3: chr "aa" "bb" "cc" "dd" ...
这到底是怎么回事,为什么jsonlite
创造这个奇怪的结构,而不是只是一个简单的data.frame
?我可以避免这种行为吗?如果不是,我该如何最优雅地纠正这一点?我已经使用了下面的方法,但最好还是觉得非常黑客。
# Any columns with embedded data frame?
newX <- X[,-which(lapply(X, class) == 'data.frame')] %>%
# Append them to the end
cbind(X[,which(lapply(X, class) == 'data.frame')])
更新
建议的解决方案解决了我的问题,但我仍然觉得我不懂的怪嵌入式data.frame结构。我会认为这样的结构在R数据格式惯例中是非法的,或者至少在使用[
的子集方面表现不同。我已经打开了一个separate question。
是的,谢谢,能解决问题,使我的哈克解决方法是多余的。但是,我想知道更多关于究竟发生了什么的细节。对于初学者来说,什么叫这个数据结构?它并不是真正的嵌套。 – JanLauGe
jsonlite正在将json数组简化为一个嵌套的数据框。你可以通过说'simplyDataFrame = F'来关闭它,但是它会返回嵌套列表。很难说,没有json文本对象的工作,但它似乎嵌套;) –
谢谢!看到我的更新后续行动:) – JanLauGe