2012-06-25 2 views
1

У меня есть набор данных, который содержит повторяющиеся строки, и я хочу, чтобы пронумеровать их следующим образом:Нумерация Дубликаты в R с использованием sqldf

Оригинальный набор данных:

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 

Большое спасибо.

С уважением,

манси

EDIT: добавлен dput() вывод, чтобы сделать его воспроизводимым и фиксированного форматирования.

ответ

3

sqldf с RPostgreSQL

Окно SQL функций из PostgreSQL faciliate решений такого рода проблемы. См FAQ#12 на sqldf home page для получения дополнительной информации об использовании PostgreSQL с sqldf:

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

sqldf с RSQLite

sqldf использует SQLite через RSQLite по умолчанию. Хотя SQLite не имеет оконных функций PostgreSQL, весь процесс установки намного проще с SQLite, поскольку его обычная установка пакета не имеет ничего общего (тогда как с PostgreSQL сам PostgreSQL должен быть отдельно установлен и настроен). Не имея эти объекты SQL-оператор с SQLite является более сложным, хотя длина заявления 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 в

Наконец мы покажем решение, которое не использует sqldf на всех, но только функциональность ядра R:

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