R:如何表示每行由任意键/值对扩充的表?

R:如何表示每行由任意键/值对扩充的表?,r,hash,dataframe,R,Hash,Dataframe,这是一个新手的问题。我开始探索R在网站分析中的应用。我有一组具有公共属性的页面视图事件,以及依赖于页面的任意属性集。例如,所有事件都将有一个用户ID,创建数据,和页面ID,但是注册“页面可能有一个特殊属性origin,其值可以是“adwords”或“organic”,等等 在JSON中,数据可能如下所示: [ { "userId":null, "pageId":"home", "sessionId":"abcd", "createdAt":1

这是一个新手的问题。我开始探索R在网站分析中的应用。我有一组具有公共属性的页面视图事件,以及依赖于页面的任意属性集。例如,所有事件都将有一个
用户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)