我有一个包含重复行的数据集,我希望将它们编号如下:
原始数据集:
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()
输出以使其可重现并修复格式化。
答案 0 :(得分:3)
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))