2012-10-30 69 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