【问题标题】:Best R data structure to return table value counts返回表值计数的最佳 R 数据结构
【发布时间】:2011-09-26 10:32:16
【问题描述】:

以下函数返回一个包含两列的 data.frame:

fetch_count_by_day=function(con){
  q="SELECT t,count(*) AS count FROM data GROUP BY t"
  dbGetQuery(con,q)    #Returns a data frame
}

t 是一个 DATE 列,因此输出如下所示:

       t       count(*)
1 2011-09-22     1438
...

我真正感兴趣的是是否已经存在给定日期的任何记录;但我也会使用计数作为健全性检查。

在 C++ 中,我会返回 std::map<std::string,int>std::unordered_map<std::string,int> (*)。 在 PHP 中,我会使用以日期为键的关联数组。

R 中最好的数据结构是什么?它是 2 列 data.frame 吗?我的第一个想法是将t 列转换为行名:

...
d=dbGetQuery(con,q)
rownames(d)=d[,1]
d$t=NULL

但是 data.frame 行名不是唯一的,所以从概念上讲它不太合适。我也不确定它是否可以更快地使用它。

(“最佳”的任何和所有定义:最快、最少内存、代码清晰、对有经验的 R 开发人员来说最不意外等。也许对所有人都有一个解决方案;如果没有,那么我想了解交易 -关闭以及何时选择每个备选方案。)

*:(对于 C++)如果基准测试显示这是一个瓶颈,我可能会将日期戳转换为 YYYYMMDD 整数并使用 std::unordered_map<int,int>;知道数据只涵盖了几年,我什至可能会在 min(t)max(t) 之间使用每天一个 int 的内存块(将所有这些都包装在一个类中)。

【问题讨论】:

  • “data.frame 行名不是唯一的”是什么意思? From ?rownames: "对于一个数据框,‘rownames’的‘value’应该是一个不重复和不丢失名字的字符向量(这是强制的),”
  • 您所说的“最佳”是什么意思?如果是搜索速度,那么data.table 可能是个好主意。
  • @mdsumner 我在这里解释和示例:r-bloggers.com/select-operations-on-r-data-frames 但他正在描述一个矩阵;数据框有什么不同吗?
  • @gsk3 “最佳”的任何和所有定义:最快、最少内存、代码清晰、对有经验的 R 开发人员来说最不意外等。也许所有人都有一个解决方案;如果不是,那么我想了解权衡以及何时选择每种替代方案。
  • 你能把这个答案添加到你的问题中吗?

标签: c++ sql r data-structures


【解决方案1】:

列联表实际上是数组(或矩阵),可以很容易地创建。dimnames 保存值,而位于其“核心”的数组/矩阵保存计数数据。 “table”和“tapply”函数是天生的创造者。您可以使用“[”访问计数并使用 dimnames() 后跟“[”来获取行名和列名。我会说使用“日期”类作为日期比存储在“字符”向量中更明智。

【讨论】:

  • 您好@DWin,感谢您的回答,并对延迟回复表示抱歉。 R table 类型在哪些方面比替代品更好(例如,data.frame,t 列变成 rownames)?还有没有更糟的方法?
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多