R:如何表示每行由任意键/值对扩充的表?
这是一个新手的问题。我开始探索R在网站分析中的应用。我有一组具有公共属性的页面视图事件,以及依赖于页面的任意属性集。例如,所有事件都将有一个R:如何表示每行由任意键/值对扩充的表?,r,hash,dataframe,R,Hash,Dataframe,这是一个新手的问题。我开始探索R在网站分析中的应用。我有一组具有公共属性的页面视图事件,以及依赖于页面的任意属性集。例如,所有事件都将有一个用户ID,创建数据,和页面ID,但是注册“页面可能有一个特殊属性origin,其值可以是“adwords”或“organic”,等等 在JSON中,数据可能如下所示: [ { "userId":null, "pageId":"home", "sessionId":"abcd", "createdAt":1
用户ID
,创建数据
,和页面ID
,但是注册“
页面可能有一个特殊属性origin
,其值可以是“adwords”
或“organic”
,等等
在JSON中,数据可能如下所示:
[
{
"userId":null,
"pageId":"home",
"sessionId":"abcd",
"createdAt":1381013741,
"parameters":{},
},
{
"userId":123,
"pageId":"signup",
"sessionId":"abcd",
"createdAt":1381013787,
"parameters":{
"origin":"adwords",
"campaignId":4
}
}
]
我一直在努力用R数据结构有效地表示这些数据特别是,我需要能够根据任意键/值对的条件对事件列表进行子集划分,例如,选择其pageId==“signup”
和origin==“adwords”
的所有事件
用于任意参数的键具有足够的多样性,因此为每个可能的键创建填充稀疏的列似乎是不合理的
我目前正在将数据预处理为两个CSV文件,core\u properties.CSV
和parameters.CSV
,格式如下:
# core_properties.csv (one record per pageview)
userId,pageId,sessionId,createdAt
,home,abcd
123,signup,abcd,1381013741
...
# parameters.csv (one record per k/v pair)
row,key,value # <- "row" here denotes the record index in core_properties.csv
1,origin,adwords
1,campaignId,4
...
现在,我可以通过以下语法访问第一个事件的origin属性:events[1,][[“parameters”]][[1][[“origin”]]
-注意,出于某种原因,它需要一个额外的[[1]]
下标。数据帧似乎不喜欢将列表作为单元格的单个值:
> events[1,][["parameters"]] <- list()
Error in `[[<-.data.frame`(`*tmp*`, "parameters", value = list()) :
replacement has 0 rows, data has 1
>events[1,][[“parameters”]]您可以使用R中的嵌套列表,这些列表可以很好地映射到JSON。我已经展示了一个简单的示例,其中根据参数原点进行过滤
dat <- list(
list(userId = NULL, pageId = "home", createdAt = 1381013741, parameters = list()),
list(userId = NULL, pageId = "new", createdAt = 1381013741, parameters = list(origin = 'adwords', campaignId = 4))
)
Filter(function(l){length(l) > 0 && l$parameters$origin == 'adwords'}, dat)
dat 0&&l$parameters$origin=='adwords'},dat)
JSON可以很好地转换为R中的list
s。列表的名称用作键。对于键控表格数据结构,请查看data.table.interest。但对于大型数据集,在列表上使用过滤器似乎比通过数据帧提供的索引慢得多:Filter(函数(x){x$pageId==“home”},data)
与data[data$page_id==“name”,]
-我使用的数据集通常有数百万行,并执行许多此类过滤操作。您是否推荐一种不同的方法?在这种情况下,我建议您查看像MongoDB这样的数据库,它们具有帮助程序包,允许您直接从R处理查询。您将发现如何使用rmongodb
执行高级查询
dat <- list(
list(userId = NULL, pageId = "home", createdAt = 1381013741, parameters = list()),
list(userId = NULL, pageId = "new", createdAt = 1381013741, parameters = list(origin = 'adwords', campaignId = 4))
)
Filter(function(l){length(l) > 0 && l$parameters$origin == 'adwords'}, dat)