【问题标题】:Increasing Year count every January每年一月增加年数
【发布时间】: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 &lt;- 2014 - cumsum(...),而是做加法:df$year &lt;- 20xx + cumsum(...)
  • @scmi 用加法代替减法是不够的。您还需要将比较运算符从&gt; 更改为&lt;
  • @Use:是的,当然,如何反转表达式非常明显。我的观点是这是一个几乎重复的问题,因此应该关闭。

标签: r


【解决方案1】:

OP 已要求从 1963 年开始按升序顺序完成年份。

以下方法在没有日期转换和虚拟日期的情况下有效,并且可以修改为适用于会计年度 (see here)。

df$year <- 1963 + cumsum(c(0L, diff(100L*as.integer(
  factor(df$month, levels = month.abb)) + df$day) < 0))
df
  day month year
1  24   Jun 1963
2  21   Mar 1964
3  20   Jan 1965
4  10   Dec 1965
5  20   Jun 1966
6  20   Jan 1967
7  10   Dec 1967
8  15   Dec 1967

请注意,有一个 question 似乎相似,但要求按降序顺序完成年份。 solution there 需要在两个地方更改才能在这里工作。

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 2021-12-18
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多