【问题标题】:Pulling JSON Data into R Dataframe将 JSON 数据拉入 R Dataframe
【发布时间】:2018-09-03 03:23:54
【问题描述】:

我正在尝试从 USNO API 中提取 JSON 月球周期数据。问题是我返回的有两个 JSON 数据数组。我没有办法指定我从天文台返回的内容,所以我认为我需要在 R 中清理它。这是我的代码:

library(sqldf);
library(jsonlite);

curr_date <- Sys.Date();
Q_date <- format.Date(curr_date, "%m/%d/%Y");
moon_call <- paste0("http://api.usno.navy.mil/moon/phase?date=",Q_date,"&nump=4");

moon_json <- fromJSON(moon_call, simplifyDataFrame =  TRUE);

moon_phases <- do.call("rbind.fill", lapply(moon_json$phasedata, as.data.frame));

我得到的数据是这样的:

"","error","apiversion","year","month","day","numphases","datechanged","phasedata.phase","phasedata.date","phasedata.time"
"1",FALSE,"2.1.0",2018,8,29,4,FALSE,"Last Quarter","2018 Sep 03","02:37"
"2",FALSE,"2.1.0",2018,8,29,4,FALSE,"New Moon","2018 Sep 09","18:01"
"3",FALSE,"2.1.0",2018,8,29,4,FALSE,"First Quarter","2018 Sep 16","23:15"
"4",FALSE,"2.1.0",2018,8,29,4,FALSE,"Full Moon","2018 Sep 25","02:52"

当将其转换为数据框时,我得到:

"","X[[i]]"
"1","Last Quarter"
"2","New Moon"
"3","First Quarter"
"4","Full Moon"
"5","2018 Sep 03"
"6","2018 Sep 09"
"7","2018 Sep 16"
"8","2018 Sep 25"
"9","02:37"
"10","18:01"
"11","23:15"
"12","02:52"

但我想要的是一个选择了phasedata.phase/.date/.time 列的数据框:

"","phase","date","time"
"1","Last Quarter","2018 Sep 03","02:37"
"2","New Moon","2018 Sep 09","18:01"
"3","First Quarter","2018 Sep 16","23:15"
"4","Full Moon","2018 Sep 25","02:52"

【问题讨论】:

  • 那么,您的代码运行良好吗?您希望在哪一部分进行改进?
  • 您是专门针对 phasedata 的 - 即 moon_json$phasedata 吗?我认为do.call("rbind.fill", lapply(moon_json, as.data.frame)); 这条线让你偏离了方向
  • 你做了什么改变?请编辑您的问题以阐明您所做的更改以及您现在看到的内容。还包括 curr_date 的值
  • 请使用更新后的代码和要求编辑您的问题;不要将它们添加为评论。
  • moon_json$phasedata 是一个 3 列 4 行的 data.frame。忘记所有do.call() 的东西。

标签: r json jsonlite


【解决方案1】:
  1. R 允许你直接从数据框moon_jsonextract the three columns,就像你想要的那样:

    moon_phases &lt;- moon_json[, c('phasedata.phase', 'phasedata.date', 'phasedata.time')]

(不需要任何do.call("rbind.fill", lapply(..., as.data.frame)) - 这只是切片然后连接的一种低效且折磨人的方式。)

  1. 然后您想重命名您的 df 列以删除 phasedata. 前缀:

    names(moon_phases) &lt;- c('phase', 'date', 'time')

或:names(moon_phases) &lt;- gsub('^phasedata\.', '', names(moon_phases))

  1. 此外,您通常不希望在 moon_json 等数据帧上显示明确的行名 1,2,3...,所以只需使用 row.names(moon_json) &lt;- NULLdata.frame(..., row.names=NULL)as.data.frame(..., row.names=NULL)

(jsonlite(或其他 R json 包之一)应该有选项来自动进行清理和重命名,我不知道,我不怎么使用它们。检查它们并选择一个包这使得刮擦不那么痛苦。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2012-02-18
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多