尝试从数据集创建引用表以查找文档的当前状态。示例如下:
Document<-c(1,1,1,1,2,2,2)
change_date <- c("2015-01-01","2015-01-03","2015-01-05","2015-01-08","2015-01-05","2015-01-07","2015-01-20")
status <- c("A","A","B","C","A","B","D")
df<-data.frame(Document,change_date,status)
基本上,决赛桌应如下所示:
Document.x status
1 1 C
2 2 D
我目前正在使用下面的代码,但肯定有一种更智能的方法可以将文档分组,状态为date == max(date)?
library(dplyr)
df$change_date <- as.Date(df$change_date)
df1<-group_by(df,Document) %>%
summarise(latest=max(change_date))
df1$uid<-paste(df1$Document,df1$latest,sep="_")
df$uid<-paste(df$Document,df$change_date,sep="_")
df2<-merge(df1,df,"uid",x.all=TRUE)
df2<-df2[,c(2,6)]
提前致谢。
答案 0 :(得分:3)
您可以直接致电max(change_date)
中的dplyr
:
df %>%
group_by(Document) %>%
filter(change_date == max(change_date)) %>%
filter(row_number() == 1) % in case you have duplicate records falling on the last date
答案 1 :(得分:2)
我们可以在&#39; change_date&#39;上使用which.max
得到最大日期的索引和子集的状态&#39;基于&#39; Document&#39;
df %>%
group_by(Document) %>%
summarise(status = status[which.max(change_date)])
# Document status
# (dbl) (fctr)
#1 1 C
#2 2 D
或者在按文档分组后,我们arrange
更改了日期&#39;下降,获取每个组的第一行,select
仅ungroup
之后的相关列。
df %>%
group_by(Document) %>%
arrange(desc(change_date)) %>%
slice(1L) %>%
ungroup() %>%
select(-change_date)
# Document status
# (dbl) (fctr)
#1 1 C
#2 2 D
使用data.table
,语法为
library(data.table)
setDT(df)[, .(status = status[which.max(change_date)]), by = Document]
或base R
df[with(df, ave(change_date, Document,
FUN= max)==change_date), c(1,3)]
# Document status
#4 1 C
#7 2 D
或使用sqldf
library(sqldf)
sqldf('select Document, status
from df
where change_date in (select max(change_date) from df
group by "Document")')
# Document status
#1 1 C
#2 2 D
注意:在OP的帖子中&#39; change_date&#39;是factor
类。在尝试上述解决方案之前,应将其转换为Date
类。
df$change_date <- as.Date(df$change_date)