1

次のようなSQLの「最初の値」ウィンドウ関数と同等の何かをRで実行しようとしています。

select *, first_value(value3) over (partition by value1, value2 order by value5 desc)
from df

sqldf / RPostgreSQLのようなものを使用するためにデータベースを作成する必要なしにRでこれを行う良い方法はありますか?

私はここでの答えのような他のいくつかの例を見てきました:sqldfのグループごとの累積合計?

しかし、ウィンドウ内の順序が重要な関数でそれを行う方法を理解するのに問題があります。もう1つは、最大500K行で作業しているため、パフォーマンスが問題になることです。

編集:ここに例があります:

item_id  rental_date   customer_id
I001     10/20/2012    1
I002     10/05/2012    4 
I001     10/15/2012    3
I004     10/19/2012    1
I001     10/11/2012    6
I002     9/15/2012     5
I004     10/13/2012    10
I001     9/30/2012     4

特定のアイテムを毎月レンタルする最初の顧客をどのように決定しますか?

4

2 に答える 2

4

sqldf / PostgreSQLを使用しないということは、sqldfを使用するが、PostgreSQLの代わりにSQLiteを使用することを意味する場合は、これを試してください(これは、昨年追加されたSQLiteの新機能に依存しており、最小値または最大値がある場合、他の列は同じ行からのものである):

Lines <- "item_id  rental_date   customer_id
I001     10/20/2012    1
I002     10/05/2012    4 
I001     10/15/2012    3
I004     10/19/2012    1
I001     10/11/2012    6
I002     9/15/2012     5
I004     10/13/2012    10
I001     9/30/2012     4"

DF <- read.table(text = Lines, as.is = TRUE, header = TRUE)
DF$rental_date <- as.Date(DF$rental_date, "%m/%d/%Y")
DF$ym <- format(DF$rental_date, "%Y-%m")

sqldf("select item_id, ym, customer_id, min(rental_date) rental_date
    from DF 
    group by item_id, ym")

この場合の結果は次のとおりです。

  item_id      ym customer_id      rental_date
1    I001 2012-09           4       2012-09-30
2    I001 2012-10           6       2012-10-11
3    I002 2012-09           5       2012-09-15
4    I002 2012-10           4       2012-10-05
5    I004 2012-10          10       2012-10-13
于 2012-10-30T15:27:50.273 に答える
2

あなたの例のオブジェクトは、data.frame私たちが呼ぶものだと思いますdf

library( "plyr" )
df$rental_date <- as.Date( df$rental_date, "%m/%d/%Y" )
df$year <-  as.numeric( format( df$rental_date, "%Y"))
df$month <- months( df$rental_date )

ddply( df, c("item_id", "month", "year"), function(x) {
  x[ min(x$rental_date) == x$rental_date, "customer_id", drop=FALSE ]
} )

結果は次のようになります。

  item_id     month year customer_id
1    I001   October 2012           6
2    I001 September 2012           4
3    I002   October 2012           4
4    I002 September 2012           5
5    I004   October 2012          10
于 2012-10-30T14:12:41.237 に答える