在多行中查找单个列中的最大日期

Ali*_*vil 13 r date

我有以下数据框:

id       <- c(1,1,2,3,3)
date     <- c("23-01-08","01-11-07","30-11-07","17-12-07","12-12-08")
df       <- data.frame(id,date)
df$date2 <- as.Date(as.character(df$date), format = "%d-%m-%y")


id     date      date2
1   23-01-08 2008-01-23
1   01-11-07 2007-11-01
2   30-11-07 2007-11-30
3   17-12-07 2007-12-17
3   12-12-08 2008-12-12
Run Code Online (Sandbox Code Playgroud)

现在我需要创建第四列并为其中的每一个插入最大事务日期id.决赛桌应如下:

id     date      date2        max
1   23-01-08 2008-01-23 2008-01-23
1   01-11-07 2007-11-01   0
2   30-11-07 2007-11-30 2007-11-30 
3   17-12-07 2007-12-17   0
3   12-12-08 2008-12-12 2008-12-12
Run Code Online (Sandbox Code Playgroud)

如果你能帮助我,我将感激不尽.

sea*_*avi 21

id<-c(1,1,2,3,3)
date<-c("23-01-08","01-11-07","30-11-07","17-12-07","12-12-08")
df<-data.frame(id,date)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")
# aggregate can be used for this type of thing
d = aggregate(df$date2,by=list(df$id),max)
# And merge the result of aggregate 
# with the original data frame
df2 = merge(df,d,by.x=1,by.y=1)
df2

  id     date      date2          x
1  1 23-01-08 2008-01-23 2008-01-23
2  1 01-11-07 2007-11-01 2008-01-23
3  2 30-11-07 2007-11-30 2007-11-30
4  3 17-12-07 2007-12-17 2008-12-12
5  3 12-12-08 2008-12-12 2008-12-12
Run Code Online (Sandbox Code Playgroud)

编辑:由于您希望当日期与最大日期不匹配时,最后一列为"空",您可以尝试下一行.

df2[df2[,3]!=df2[,4],4]=NA

df2
  id     date      date2          x
1  1 23-01-08 2008-01-23 2008-01-23
2  1 01-11-07 2007-11-01       <NA>
3  2 30-11-07 2007-11-30 2007-11-30
4  3 17-12-07 2007-12-17       <NA>
5  3 12-12-08 2008-12-12 2008-12-12
Run Code Online (Sandbox Code Playgroud)

当然,清理colnames等总是很好,但我会留给你.


sea*_*ody 9

另一种方法是使用plyr包:

library(plyr)
ddply(df, "id", summarize, max = max(date2))

#  id        max
#1  1 2008-01-23
#2  2 2007-11-30
#3  3 2008-12-12
Run Code Online (Sandbox Code Playgroud)

现在这不是你所追求的格式,因为它只显示每id一次.永远不要害怕,我们可以使用transform而不是summarize:

ddply(df, "id", transform, max = max(date2))

#  id     date      date2        max
#1  1 01-11-07 2007-11-01 2008-01-23
#2  1 23-01-08 2008-01-23 2008-01-23
#3  2 30-11-07 2007-11-30 2007-11-30
#4  3 12-12-08 2008-12-12 2008-12-12
#5  3 17-12-07 2007-12-17 2008-12-12
Run Code Online (Sandbox Code Playgroud)

和@ seandavi的回答一样,这会重复max每个的日期id.如果你想要重复更改NA,这样的事情将完成工作:

within(ddply(df, "id", transform, max = max(date2)), max[max != date2] <- NA)
Run Code Online (Sandbox Code Playgroud)


avi*_*seR 6

dplyr在有人看的情况下添加解决方案:

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(max = if_else(date2 == max(date2), date2, as.Date(NA))) 
Run Code Online (Sandbox Code Playgroud)

结果:

# A tibble: 5 x 4
# Groups:   id [3]
     id     date      date2        max
  <dbl>   <fctr>     <date>     <date>
1     1 23-01-08 2008-01-23 2008-01-23
2     1 01-11-07 2007-11-01         NA
3     2 30-11-07 2007-11-30 2007-11-30
4     3 17-12-07 2007-12-17         NA
5     3 12-12-08 2008-12-12 2008-12-12
Run Code Online (Sandbox Code Playgroud)