これが私が思いついたものです。このコードが常に機能するかどうかはわかりませんが、使用したサンプル データ セットでは機能するようです。コードは 2 年以上、年中いつでも処理できるようです。
コードはデータのない年を処理できませんが、年がデータ セットにない場合、そのようなギャップはおそらく特定できません。
また、このアプローチは、「1/30」と「3/1」の 2 つの日付で失敗することにも注意してください。2 つの日付が 2 年連続した場合です。これは、2 つの日付の間に非常に大きな隔たりがあるため、コンピューターが 2 つの日付が同じ年ではないことを認識する方法がないためです。
言い換えれば、2 つの連続する日付の間に非常に長いギャップがある場合、追加情報がなければ、どのアプローチも失敗する可能性があります。たとえば、四半期ごとまたは半年ごとに少なくとも1つの日付がある場合、コンピューターは連続した月の減少を新しい年を示すものとして識別できるため、投稿された両方の回答が機能すると思います.
連続する 2 つの日付間の最長の間隔が 11 か月である場合、両方のアプローチが機能する可能性があります。連続する 2 つの日付のそれぞれの日もチェックするようにコードを修正すれば、363 日のギャップは問題ないかもしれません。
# specify the initial year and create dates from the data
initial.year = 2010
date <- c("12/30", "1/1", "6/1", "6/1", "10/25", "11/27", "12/28",
"1/16", "2/17", "2/17", "2/17")
DDD3 <- as.Date(date, format="%m/%d")
# deconstruct dates into month, day and erroneous year
dtstr <- as.character(DDD3)
month <- as.numeric(as.character(sapply(strsplit(dtstr, "-") , "[", 2)))
day <- as.numeric(as.character(sapply(strsplit(dtstr, "-") , "[", 3)))
year <- as.numeric(as.character(sapply(strsplit(dtstr, "-") , "[", 1)))
DDD4 <- data.frame(month, day, year)
# obtain correct year for each date
year2=rep(NA, nrow(DDD4))
year2[1] = initial.year
for(i in 2:length(year2)) {
if(DDD4[i,1] < DDD4[(i-1),1]) (year2[i] = year2[(i-1)]+1)
if(DDD4[i,1] >= DDD4[(i-1),1]) (year2[i] = year2[(i-1)])
}
# create new dates using correct year
day2 <- sprintf("%02d", day)
month2 <- sprintf("%02d", month)
year2 <- as.character(year2)
DDD5 <- data.frame(month2, day2, year2)
DDD6 <- paste(DDD5[,1], DDD5[,2], DDD5[,3], sep='/')
DDD7 <- as.Date(DDD6, "%m/%d/%Y")
DDD7
# [1] "2010-12-30" "2011-01-01" "2011-06-01" "2011-06-01"
# "2011-10-25" "2011-11-27" "2011-12-28" "2012-01-16"
# "2012-02-17" "2012-02-17" "2012-02-17"