1) Try tapply
像这样:
dates <- c("2015-05-13", "2015-05-12", "2015-05-11", "2015-04-27",
"2015-04-24", "2015-04-23")
tapply(dates, substr(dates, 1, 7), max)
or this:
library(zoo)
tapply(dates, as.yearmon(dates), max)
2)如果日期位于数据框中:
DF <- data.frame(dates, stringsAsFactors = FALSE)
aggregate(DF["dates"], list(month = substr(DF$dates, 1, 7)), max)
或更换substr(...)
with as.yearmon(DF$dates)
.
3)这会选出每个月的最后一行。在这种情况下ave
返回一个字符变量所以需要使用as.logical
将其转换为逻辑:
isMax <- function(x) seq_along(x) == which.max(as.Date(x))
subset(DF, as.logical(ave(dates, substr(dates, 1, 7), FUN = isMax)))
or use as.yearmon(dates)
代替substr(...)
。以下定义isMax
可以替代
isMax <- function(x) seq_along(x) == which.max(as.Date(x))
并给出相同的结果,除非有多个最大值。在这种情况下,它仅给出第一个,而早期的定义给出了全部。作为which.max
不适用于"character"
我们将日期转换为的类"Date"
class.
下次请使用dput
显示您的数据或以可复制的形式提供数据,就像我们上面所做的那样。还将其减少到说明问题所需的最小数量。