在R

时间:2016-05-02 03:23:16

标签: r group-by dplyr

尝试从数据集创建引用表以查找文档的当前状态。示例如下:

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)]

提前致谢。

2 个答案:

答案 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;下降,获取每个组的第一行,selectungroup之后的相关列。

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)