将基于记录的列表/对象展平为数据帧

2024-04-26

编辑:这个问题已经过时了。这jsonlite https://cran.r-project.org/web/packages/jsonlite/index.html包装自动压平。

我正在处理具有基于记录的编码(通常采用 JSON)的在线数据流。对象的结构(即 JSON 中的名称)可从 API 文档中得知,但是,值大多是可选的,并不出现在每个记录中。列表可以包含新列表,并且结构有时相当深。下面是一些 GPS 数据的一个非常简单的示例:http://pastebin.com/raw.php?i=yz6z9t25 http://pastebin.com/raw.php?i=yz6z9t25。请注意,在下面的行中,"l"由于没有 GPS 信号,物体丢失。

我正在寻找一种优雅的方法将这些对象展平为数据框。我目前正在使用这样的东西:

library(RJSONIO)
library(plyr)

obj <- fromJSON("http://pastebin.com/raw.php?i=yz6z9t25", simplifyWithNames=FALSE, simplify=FALSE)
flatdata <- lapply(obj$data, as.data.frame);
mydf <- rbind.fill(flatdata)

这可以完成工作,但是速度很慢并且容易出错。这种方法的一个问题是我没有利用我对数据结构(对象名称)的了解;相反,它是从数据中推断出来的。当每条记录中碰巧缺少某个属性时,这会导致问题。在这种情况下,它根本不会出现在数据框中,而是出现在具有 NA 值的列中。这可能会导致下游问题。例如,我需要处理位置时间戳:

mydf$l.t <- structure(mydf$l.t/1000, class="POSIXct")

但是,如果数据集包含以下内容,这将导致错误:l$t对象不存在。此外,两者as.data.frame and rbind.fill让事情变得很慢。示例数据集是一个相对较小的数据集。对于更好的实施有什么建议吗?强大的解决方案始终会生成具有相同顺序的相同列的数据帧,并且仅行数发生变化。

编辑:在具有更多元数据的数据集下方。它的尺寸更大并且嵌套更深:

obj <- fromJSON("http://www.stat.ucla.edu/~jeroen/files/output.json", simplifyWithNames=FALSE, simplify=FALSE)

这是一个解决方案,可让您利用对数据字段名称和类的先验知识。此外,通过避免重复调用as.data.frame和单个调用plyr's rbind.fill()(两者都是时间密集型)它在示例数据上的运行速度大约快 60 倍。

cols <- c("id", "ls", "ts", "l.lo","l.tz", "l.t", "l.ac", "l.la", "l.pr", "m")   
numcols <- c("l.lo", "l.t", "l.ac", "l.la")

## Flatten each top-level list element, converting it to a character vector.
x <- lapply(obj$data, unlist)
## Extract fields that might be present in each record (returning NA if absent).
y <- sapply(x, function(X) X[cols])
## Convert to a data.frame with columns of desired classes.
z <- as.data.frame(t(y), stringsAsFactors=FALSE)
z[numcols] <- lapply(numcols, function(X) as.numeric(as.character(z[[X]])))

Edit:为了确认我的方法给出的结果与原始问题中的结果相同,我运行了以下测试。 (请注意,在这两种情况下我都设置了stringsAsFactors=FALSE以避免因子水平的排序出现无意义的差异。)

flatdata <- lapply(obj$data, as.data.frame, stringsAsFactors=FALSE)
mydf <- rbind.fill(flatdata)
identical(z, mydf)
# [1] TRUE

进一步编辑:

仅供记录,这里是上述内容的替代版本,另外还会自动:

  1. 查找所有数据字段的名称
  2. 决定他们的类别/类型
  3. 将最终 data.frame 的列强制为正确的类

.

dat <- obj$data

## Find the names and classes of all fields
fields <- unlist(lapply(xx, function(X) rapply(X, class, how="unlist")))
fields <- fields[unique(names(fields))]
cols <- names(fields)

## Flatten each top-level list element, converting it to a character vector.
x <- lapply(dat, unlist)
## Extract fields that might be present in each record (returning NA if absent).
y <- sapply(x, function(X) X[cols])
## Convert to a data.frame with columns of desired classes.
z <- as.data.frame(t(y), stringsAsFactors=FALSE)

## Coerce columns of z (all currently character) back to their original type
z[] <- lapply(seq_along(fields), function(i) as(z[[cols[i]]], fields[i]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将基于记录的列表/对象展平为数据帧 的相关文章

  • 从因子转换时间/日期

    我希望将时间从因子转换为日期 对于示例数据框 date time lt structure list date structure c 1L 1L 1L 1L 1L 1L 1L 1L 1L Label 02 02 2013 class fa
  • 使用插入符号完全可重现的并行模型

    当我在插入符中运行 2 个随机森林时 如果设置随机种子 我会得到完全相同的结果 library caret library doParallel set seed 42 myControl lt trainControl method cv
  • 使用 writeLines 将变量写入文件

    我发现此链接对于理解如何将行写入文件非常有帮助 将文本行写入 R 中的文件 https stackoverflow com questions 2470248 write lines of text to a file in r 不幸的是
  • 根据 R 中的另一个变量过滤簇中的 id

    我有 100 名患者的数据 每个患者都有 7 天 1 到 7 的值 如何仅在第一天根据另一个变量选择患者 df lt data frame id c 1 1 1 2 2 2 day c 1 2 3 1 2 3 RRT c 0 1 0 1 0
  • 从数据帧创建 sf 多边形

    我有一个包含一组多边形坐标的数据框 这就是我将其转换为spatialPolygons 包sp 的方法 my df lt data frame Plot c A A A A A B B B B B Corner c SW NW NE SE S
  • 相对于时间求平均值

    我有以下带有日期时间和相应值的数据集 时间间隔为每10分钟一次 我需要以 15 分钟的间隔生成新行 例如 15 40 的值为 599 15 50 的值为 594 因此需要在两者之间生成一个新行 即 15 45 的平均值为 599 和 594
  • 可以使用部分名称访问列表成员吗?这是一个功能吗?

    考虑这个 R 代码 gt l list key 1 gt l k 1 1 gt l ke 1 1 gt l k NULL gt names l 1 key 这是否意味着您可以使用以下方式访问列表成员 及其部分名称 当我在一次令人沮丧的错误搜
  • 使用条件求 R 中的累积和

    我需要创建一个新变量 其中包含每个 ID 过去三年金额的总和 如果没有三年的数据 则应显示 NA 举个例子 ID YEAR AMOUNT 1 2010 5 1 2011 2 1 2012 4 1 2013 1 1 2014 3 2 2013
  • 如何将曲线拟合到直方图

    我已经探讨了有关该主题的类似问题 但在我的直方图上生成漂亮的曲线时遇到了一些麻烦 我知道有些人可能会认为这是重复的 但我目前还没有找到任何可以帮助解决我的问题的东西 尽管数据在此处不可见 但这里是我使用的一些变量 以便您可以在下面的代码中看
  • 在 R 中创建 xlsx 工作表 - 字体颜色不起作用

    我正在开发一个项目 需要从特定类型的数据框架自动生成数据电子表格 我读过关于如何执行此操作的有用解释here http www sthda com english wiki r xlsx package a quick start guid
  • R 语言 NaN + NA 行为

    我有一个关于 R 中算术行为的问题 看下面这段代码 gt NaN NA 1 NaN gt gt gt NaN as integer NA gt NA 所以 我很困惑这两个添加给出了不同的结果 有谁知道这是否是真正想要的行为还是只是某种错误
  • 移动 sf 对象的经度

    我有一张国家地图 sf 对象 我想改变俄罗斯东部的经度 以便它不与俄罗斯其他地区隔离 看图片 https i stack imgur com NBjyK jpg 我找到了后端代码st shift longitude https github
  • 在 jupyter 笔记本中内联显示 R ggplots

    我正在尝试运行这里找到的一个简单示例 https www datacamp com community blog jupyter notebook r gs OczVCjA https www datacamp com community
  • 如何使用ggplot2中的线将箱线图的中值与多个组连接起来?

    我正在尝试使用 ggplot2 连接箱线图的中值 但线条不在正确的位置 这是我使用的代码 library datasets library ggplot2 data airquality airquality Month lt factor
  • 删除 R 数据框中所有列名称的前两个字符

    有没有办法从数据框中的所有列名中按位置删除字符串 例如 如果我有如下列名称 ab sales1 kj sales2 lm sales3 pk sales100 10 34 64 288 我希望我的输出列名称类似于 sales1 sales2
  • 如何找到连续数字的区间开始和结束的位置?

    我有一个向量 vec lt c 2 3 5 6 7 8 16 19 22 23 24 连续的数字是 c 2 3 c 5 6 7 8 c 22 23 24 所以第一个向量从 2 开始 到 3 结束 第二个向量从 5 开始 到 8 结束 对于第
  • Databricks:如何从 R Dataframe 切换到 Pandas Dataframe(同一笔记本中的 R 到 python)

    我正在 Databricks 笔记本中编写 R 代码 该代码在 R 中执行多项操作 清理数据帧后 我想使用 python 在 python 单元中调用它 因此使用 python 代码继续对数据帧进行操作 因此 我想在 python 块内将我
  • R中舍入单位的舍入数字[重复]

    这个问题在这里已经有答案了 我正在尝试按舍入单位对数字进行舍入 例如 value lt c 8 21 1 76 6 42 1 94 10 38 如果舍入单位为 0 2 则结果为 8 2 1 8 6 4 2 0 10 4 我怎样才能在R中做到
  • RStudio 服务器未启动

    过去几个月我一直在远程 RStudio 服务器上工作 没有任何问题 今天 我使用此命令重新启动了 rstudio 服务器 sudo rstudio server restart 此后 我无法通过浏览器访问服务器 它继续等待 我用这个检查了状
  • R 语言与 php 集成以获取 R 的结果

    我有以下 R 脚本 assign data path data path lt C Users Owner Desktop R work assign valus to the following three percent train p

随机推荐