我'm trying to extract a JSON data which is a column in a CSV file. So far I'已经到了使用 jsonlite
包将一个因子转换为json文件的地步 .
[1] {"id":509746197991998767,"visibility":{"percentage":100,"time":149797,"visible1":true,"visible2":false,"visible3":false,"activetab":true},"interaction":{"mouseovercount":1,"mouseovertime":1426,"videoplaytime":0,"engagementtime":0,"expandtime":0,"exposuretime":35192}}
另一种方法是在导入时使用 stringsAsFactors = F
,但我正在努力使格式正确,其中每个条目如下所示:
[1] "{\"id\":509746197991998767,\"visibility\":{\"percentage\":100,\"time\":149797,\"visible1\":true,\"visible2\":false,\"visible3\":false,\"activetab\":true},\"interaction\":{\"mouseovercount\":1,\"mouseovertime\":1426,\"videoplaytime\":0,\"engagementtime\":0,\"expandtime\":0,\"exposuretime\":35192}}"
我错过了一些明显的东西吗?我只是想要提取位于CSV文件中的 JSON
文件 .
下面是一个CSV文件的小例子:
"","CookieID","UnloadVars"
"1",-8857188784608690176,"{""id"":509746197991998767,""visibility"":{""percentage"":100,""time"":149797,""visible1"":true,""visible2"":false,""visible3"":false,""activetab"":true},""interaction"":{""mouseovercount"":1,""mouseovertime"":1426,""videoplaytime"":0,""engagementtime"":0,""expandtime"":0,""exposuretime"":35192}}"
"2",-1695626857458244096,"{""id"":2917654329769114342,""visibility"":{""percentage"":46,""time"":0,""visible1"":false,""visible2"":false,""visible3"":false,""activetab"":true}}"
"3",437299165071669184,"{""id"":2252707957388071809,""visibility"":{""percentage"":99,""time"":10168,""visible1"":true,""visible2"":false,""visible3"":false,""activetab"":true},""interaction"":{""mouseovercount"":0,""mouseovertime"":0,""videoplaytime"":0,""engagementtime"":0,""expandtime"":0,""exposuretime"":542},""clicks"":[{""x"":105,""y"":449}]}"
"4",292660729552227520,""
"5",7036383942916227072,"{""id"":2299674593327687292,""visibility"":{""percentage"":76,""time"":1145,""visible1"":true,""visible2"":false,""visible3"":false,""activetab"":true},""interaction"":{""mouseovercount"":0,""mouseovertime"":0,""videoplaytime"":0,""engagementtime"":0,""expandtime"":0,""exposuretime"":74},""clicks"":[{""x"":197,""y"":135},{""x"":197,""y"":135}]}"
问候,
弗雷德里克 .
3 回答
在每个单独的值上使用
jsonlite::fromJSON
,然后tidyr::unnest
我使用readr :: read_csv读取您的示例数据集 .
正如您所看到的,UnloadVars是作为字符而不是因素读入的 . 如果我现在检查UnloadVars列中的第一个值,我会看到以下内容与您获得的内容相匹配,
现在,我使用jsonlite :: fromJSON,
我相信你需要的是因为JSON被解析为R中的列表 .
处理JSON数据可能非常棘手 . 作为一般指导,您应始终努力将数据放在数据框中 . 然而,这并非总是可行的 . 在特定情况下,我没有看到在格式良好的数据框中同时具有
visibility
和interaction
值的方法 .接下来我要做的是将
interaction
中的信息提取到数据框中 .加载所需的包并读取数据
然后删除无效的JSON
将每个JSON转换为一个列表并将它们放入
UnloadVars
列 . 如果您不知道,可以在数据框中包含列表列 . 这非常有用 .我们现在可以从
Unload Vars
中的列表中提取ID . 这很简单,因为每个列表只有一个ID .最后一部分看起来有点令人生畏 . 但我在这里做的是从
UnloadVars
列获取交互部分并将其放入interaction
列 . 然后,我将interaction
(列表)中的每一行转换为具有两列的数据框:key
和value
.key
包含交互度量标准的名称,value
包含其值 . 我终于把它取消了,所以我们摆脱列表列,最后得到一个格式很好的数据框 .解决方案不是很优雅,但可以完成工作 . 您可以应用相同的逻辑从可见性中提取信息 .