【发布时间】:2018-01-22 20:30:46
【问题描述】:
我有一个类似这样的数据框:
我知道第一个 obs 的起始年份(1963 年)。 obs按确切的时间顺序排列。因此,“Jan”(obs 13)的下一个实例表明年份是 1964 年。有没有办法创建一个“Year”列,每次下一次出现“Jan”时都会增加当前年份?
在图片中,它将是“1964”,然后当“Jan”再次出现时,1965 等等......
有一个类似问题的答案,但它并没有完全做到这一点,这里是:
## Make data easily reproducible
df <- data.frame(day=c(24, 21, 20, 10, 20, 20, 10, 15),
month = c("Jun", "Mar", "Jan", "Dec", "Jun", "Jan", "Dec", "Dec"))
## Convert each month-day combo to its corresponding "julian date"
datestring <- paste("1963", match(df[[2]], month.abb), df[[1]], sep = "-")
date <- strptime(datestring, format = "%Y-%m-%d")
julian <- as.integer(strftime(date, format = "%j"))
## Transitions between years occur wherever julian date increases between
## two observations
df$year <- 1963 - cumsum(diff(c(julian[2], julian))>0)
但这不会这样做:因为最后两个观测值具有相同的月份(“Dec”,然后是另一个“Dec”),所以年份的计数会增加:
最后的观察结果仍应为“1960”而不是“1959”。
【问题讨论】:
-
在“R 按顺序填写缺失的年份”中,年份按递减顺序编号。无论如何要以递增的顺序执行此操作?谢谢
-
那么不要减去
df$year <- 2014 - cumsum(...),而是做加法:df$year <- 20xx + cumsum(...) -
@scmi 用加法代替减法是不够的。您还需要将比较运算符从
>更改为<。 -
@Use:是的,当然,如何反转表达式非常明显。我的观点是这是一个几乎重复的问题,因此应该关闭。
标签: r