我的数据结构如下所示。这是在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
答案 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)中的记录相匹配。