2012-10-30 131 views
1

我試圖做R中的東西,相當於「第一值」在SQL窗口化功能,如:R中的窗口函數?

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

有R中做到這一點的好方法,而無需創建一個數據庫使用類似sqldf/RPostgreSQL的東西?

我見過喜歡這裏的答案,其他一些例子:Cumulative sum by group in sqldf?

,但我有一些麻煩搞清楚如何使用功能做了窗口事項中的順序。另一件事是我正在使用〜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 

我將如何確定的第一個客戶租每個月給定的項目?

+1

你可以爲我們這些不精通SQL的人擴展描述嗎? –

+0

您可以修改鏈接問題中的答案以返回第一行。它看起來像'dt [,.SD [1,],by = yourKey]'。有一些很好的答案[這裏](http://stats.stackexchange.com/questions/7884/fast-ways-in-r-to-get-the-first-row-of-a-data-frame-grouped -by-AN-標識符/ 7889#7889)。您可能會想要在日期列上進行一些操作來提取月份。你有多年的數據?即需要與2012年1月分開分析2011年1月?有些事情要記住...... – Chase

回答

4

如果不使用sqldf/PostgreSQL的你的意思是使用sqldf但使用SQLite,而不是PostgreSQL的那就試試這個(這依賴於加入的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 
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 
+0

對不起,只是看到你想要第一個客戶每個項目和每月。修復。 – Beasterfield

+0

如果他們擔心性能,plyr可能不是最好的解決方案。 –

+0

@JoshuaUlrich一般這是真的。但是我總會爲了一個簡單易讀的代碼而犧牲幾個運行時間。此外,還有一些調整,如下所述,可以提升'ddply':http://stackoverflow.com/a/3685919/766828 – Beasterfield