通过R选择最大日期SQL组进行观察

时间:2015-04-13 20:46:22

标签: sql r group-by

我的数据结构如下所示。这是在R代码中,但如果您可以只编写查询而没有R的东西也很好。

我有多个小组,每个观察都有日期。我想从每个组中选择与该特定组的最大日期(最近日期)对应的单行。没有重复的日期。

Df = data.frame(dates=c('2012-01-25','2012-08-20','2013-07-31','2013-05-30'), 
                group=c('a','a','b','b'), 
                value=c(1,2,3,4))

Library(sqldf)
(Desiredresults = Df[2:3,])
# 1 2012-08-20     a     2
# 2 2013-07-31     b     3

2 个答案:

答案 0 :(得分:4)

目前尚不清楚你想要R或SQL的解决方案,所以这两者都是。 首先,我假设您的dates列属于Date

Df$dates <- as.Date(Df$dates)

<强> SQL

使用sqldf包你基本上有两个简单的解决方案,要么明确选择dates最大的列

sqldf('select max(dates) as dates, "group", value from Df group by "group"')
#        dates group value
# 1 2012-08-20     a     2
# 2 2013-07-31     b     3

或者您可以选择所有

sqldf('select * from Df where dates in (select max(dates) from Df group by "group")')
#        dates group value
# 1 2012-08-20     a     2
# 2 2013-07-31     b     3

<强> - [R

所以在R中可能有很多可能的解决方案

library(data.table)
setDT(Df)[, .SD[which.max(dates)], by = group]
#    group      dates value
# 1:     a 2012-08-20     2
# 2:     b 2013-07-31     3

或者

library(dplyr)
Df %>%
  group_by(group) %>%
  filter(dates == max(dates))

# Source: local data table [2 x 3]
# Groups: group
# 
#        dates group value
# 1 2012-08-20     a     2
# 2 2013-07-31     b     3

或者

do.call(rbind, by(Df, Df$group, function(x) x[which.max(x$dates), ]))
#         dates group value
# 1: 2012-08-20     a     2
# 2: 2013-07-31     b     3

答案 1 :(得分:0)

我不知道R但你的SQL会是这样的:

SELECT * FROM YourTable as A 
INNER JOIN (SELECT GROUPS, MAX(DATES) AS MAX_DATE FROM YourTable GROUP BY GROUPS) AS B 
ON A.GROUPS = B.GROUPS AND B.MAX_DATE = A.DATES

这将识别每个组的最大日期(派生表B),然后将它们与主表(表A)中的记录相匹配。