1

重複する行を含むデータセットがあり、次のように番号を付けたいと思います。

元のデータセット:

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()再現可能にするために出力を追加し、フォーマットを修正しました。

4

1 に答える 1

3

RPostgreSQLを使用したsqldf

PostgreSQLのSQLウィンドウ関数は、この種の問題の解決を容易にします。sqldfでのPostgreSQLの使用の詳細については、sqldfホームページのFAQ#12を参照してください。

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

RSQLiteを使用したsqldf

sqldfはデフォルトでRSQLite経由でSQLiteを使用します。SQLiteにはPostgreSQLのウィンドウ機能がありませんが、SQLiteを使用すると、通常のパッケージを追加する必要がないため、インストールプロセス全体がはるかに簡単になります(PostgreSQLの場合、PostgreSQL自体を個別にインストールして構成する必要があります)。これらの機能がないため、SQLiteを使用した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のアベニュー

最後に、sqldfをまったく使用せず、コアR機能のみを使用するソリューションを示します。

transform(DF, count = ave(pol_no, pol_no, FUN = seq_along))
于 2012-06-25T15:22:06.807 に答える