楼主: fcfc2013
2123 8

[问答] 这个list 怎么转成数据框?给予解答者100金币 [推广有奖]

  • 3关注
  • 1粉丝

已卖:1169份资源

博士生

76%

还不是VIP/贵宾

-

威望
0
论坛币
7223 个
通用积分
6.2147
学术水平
12 点
热心指数
26 点
信用等级
9 点
经验
14348 点
帖子
307
精华
0
在线时间
285 小时
注册时间
2013-2-13
最后登录
2020-2-7

楼主
fcfc2013 发表于 2018-3-13 12:30:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
3.jpg
4.jpg
我要要转换成 数据框

simnum

carid

carnum

64959409512

999593

鄂A21N65

64959426194

1010852

鄂A3QD28

64959433733

999596

鄂A55LN8

原数据我保存为.json 文档  在下面下载
carlist.rar (1.39 KB) 本附件包括:
  • carlist.json

CarList.rar (1.59 KB) 本附件包括:
  • CarList.RData
(含有R环境数据文件)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:list IST 数据框 json NUM List rlist

沙发
stike6000 发表于 2018-3-13 13:36:26
library(RJSONIO)

fromJSON("e:/carlist.json",encoding = "utf-8") -> the_carlist_json

sapply(the_carlist_json,unlist) -> carlist
carlist[row.names(carlist)=="SimNum"] -> SimNum
carlist[row.names(carlist)=="CarId"] -> CarId
carlist[row.names(carlist)=="CarNum"] -> CarNum

data.frame(SimNum,CarId,CarNum,stringsAsFactors = F) -> carlist_sheet
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
fcfc2013 + 5 + 2 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

藤椅
cheetahfly 在职认证  发表于 2018-3-13 14:03:31
把你的json文件的头部“{Rows:”和尾部“}”删除,再存档,再用jsonlite::fromJSON()读取,就是你要的data.frame格式了。
如果你R环境中的对象比较复杂,你直接用save(carlist, file = "carlist.RData")函数存为“carlist.RData”文件,然后打包上传吧。
已有 1 人评分论坛币 收起 理由
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

板凳
stike6000 发表于 2018-3-13 14:06:18
直接可以用RJSONIO包读,其实没那么复杂。
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

报纸
fcfc2013 发表于 2018-3-13 15:14:41
cheetahfly 发表于 2018-3-13 14:03
把你的json文件的头部“{Rows:”和尾部“}”删除,再存档,再用jsonlite::fromJSON()读取,就是你要的data. ...
我上传了含有R 环境的对象 文件, CarList
除掉 “{Rows:”和尾部“}” jsonlite::fromJSON()是可以正常的解析,转成数据框。
但我是从网站上POST获取的数据, 批量获取,没获取一份数据就去掉 “{Rows:”和尾部“}”太麻烦。

我是这样获取数据的
GetCurrentCarList <- POST(str_c(topgps_url,GetCurrentCarList_url),
                          add_headers(.headers = headers),
                          set_cookies(.cookies = cookies),
                          body = payload, encode ="form", verbose())   # POST方式,获取车辆列表
CarList <- GetCurrentCarList %>%
  content("raw") %>%
  str_conv("utf-8")

地板
fcfc2013 发表于 2018-3-13 15:55:55
stike6000 发表于 2018-3-13 14:06
直接可以用RJSONIO包读,其实没那么复杂。
我参考 你转换list 为 data.frame 方法,可行。
我是获取 一个GPS站点的车辆gps数据, POST回的几种数据(主要是各种查询参数下返回的json数据)

如我查询 “车辆行车明细”:
DrivingStat <- POST(str_c(topgps_url,DrivingStat_url),
                    add_headers(.headers = headers),
                    set_cookies(.cookies = cookies),
                    body = DrivingStat_payload,
                    encode ="form", verbose(), accept_json())

drivingstat <- DrivingStat %>%
  content("raw") %>%     # 获得数据都是“raw”类
  
str_conv("utf-8")  %>%    # 转换二进制数据
  fromJSON() %>%           # 再读为json
  `[[`(2)            # 第二个list 是我要的数据
12.png
  读取的列表格式  就发现  他是将 一辆车的所有 信息 为 一个 列表, 这样 我就没法进行 统计 ;(比如  sum(traveltime) 等)-------
在你的 上面给出的 方法 是用unlist将它简化为生成一个包含x中所有原子组件的向量,再row.names设置数据框的行名称。
像这列表中 名称比较多
TIM截图20180313160429.png
要转换成行名称 能让它自动识别的方法吗?
或是:直接转换成数据框?
R环境中的对象比较复杂我直接把这个变量保存为.RData 上传了
[attach]drivingstat.RData[/attach]

drivingstat.rar
下载链接: https://bbs.pinggu.org/a-2430530.html

2.08 KB

本附件包括:

  • drivingstat.RData

7
cheetahfly 在职认证  发表于 2018-3-13 16:31:46
针对你上传的两个“RData”文件中的变量:
  1. library(tidyverse)
  2. # 变量carlist
  3. matrix(as.vector(carlist), ncol = 3, byrow = TRUE) %>%
  4.     as_data_frame() %>%
  5.     setNames(c("SimNum", "CarId", "CarNum")) %>%
  6.     mutate(SimNum = as.numeric(SimNum),
  7.            CarId = as.integer(CarId))

  8. # 变量drivingstat
  9. bind_rows(lapply(drivingstat, function(x) as.data.frame(t(x))))
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
fcfc2013 + 5 + 2 + 2 + 2 好的意见建议

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

8
stike6000 发表于 2018-3-13 17:14:19
  1. load("E:/drivingstat.RData")

  2. length(drivingstat) ->  the_row_num
  3. length(drivingstat[[1]]) ->  the_col_num
  4. names(drivingstat[[1]]) -> the_carlist_name

  5. rapply(object = drivingstat, as.vector) -> the_carlist
  6. data.frame(matrix(
  7.   data = the_carlist,
  8.   nrow = the_row_num
  9.   ncol = the_col_num,
  10.   byrow = T
  11. )) -> carlist_sheet

  12. names(carlist_sheet) <- the_carlist_name
复制代码


根据你的数据结构来的,用每个JSON里的元素数量作为列数,总请求条数作为行数建立矩阵。
已有 1 人评分论坛币 收起 理由
cheetahfly + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

9
lxt110721 发表于 2018-3-14 16:31:58 来自手机
fcfc2013 发表于 2018-3-13 12:30
我要要转换成 数据框
原数据我保存为.json 文档  在下面下载

谢谢分享

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 10:57