使用sqldf在R中对重复项进行编号

时间:2012-06-25 13:55:48

标签: mysql r

我有一个包含重复行的数据集,我希望将它们编号如下:

原始数据集:

DF <- structure(list(pol_no = c(1L, 1L, 2L, 2L, 2L), os = c(23L, 33L, 
45L, 56L, 45L), paid = c(45L, 67L, 78L, 89L, 78L)), .Names = c("pol_no", 
"os", "paid"), class = "data.frame", row.names = c(NA, -5L))

看起来像这样:

> DF
  pol_no os paid
1      1 23   45
2      1 33   67
3      2 45   78
4      2 56   89
5      2 45   78

我希望在pol_no中对重复项进行编号,如下所示:

pol_no   os   paid  count
1        23    45      1
1        33    67      2
2        45    78      1
2        56    89      2
2        45    78      3

提前多多感谢。

此致

曼西

编辑:添加dput()输出以使其可重现并修复格式化。

1 个答案:

答案 0 :(得分:3)

带有RPostgreSQL的

sqldf

PostgreSQL的SQL窗口功能促进了这类问题的解决方案。有关使用PostgreSQL和sqldf的更多信息,请参阅FAQ#12上的sqldf home page

library(RPostgreSQL)
library(sqldf)
sqldf('select *, rank() over  (partition by "pol_no" order by CTID) count
       from "DF" 
       order by CTID ')

使用RSQLite的sqldf

sqldf默认使用SQLite通过RSQLite。尽管SQLite缺少PostgreSQL的窗口函数,但整个安装过程对于SQLite来说要简单得多,因为它是一个普通的软件包安装,没有任何额外的操作(而对于PostgreSQL,PostgreSQL本身必须单独安装和配置)。缺乏这些功能,SQL语句的SQL语句更复杂,尽管SQL语句的长度实际上类似:

# if RPostgreSQL was previously attached & loaded then detach and & unload it
detach("package:RPostgreSQL", unload = TRUE)

sqldf("select a.*, count(*) count
       from DF a, DF b 
       where a.pol_no = b.pol_no and b.rowid <= a.rowid group by a.rowid"
)

R's ave

最后,我们展示了一个完全不使用sqldf但只使用核心R功能的解决方案:

transform(DF, count = ave(pol_no, pol_no, FUN = seq_along))