我有一个类似于此的数据框:
我知道第一个障碍的开始年份(1963年)。 obs的确切时间顺序。所以下一个" Jan" (obs 13)表明这一年是1964年。有没有办法创建一个专栏" Year"每次下一次出现" Jan"发生?
在图片中,它将是" 1964"然后当" Jan"再次发生,1965年等等......
对于类似的问题有一个答案,但它并没有做到这一点,现在它是:
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket. */
struct sockaddr_un
{
__SOCKADDR_COMMON (sun_);
char sun_path[108]; /* Path name. */
};
#ifdef __USE_MISC
# include <string.h> /* For prototype of `strlen'. */
/* Evaluate to actual length of the `sockaddr_un' structure. */
// vvv This is NULL?
# define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
+ strlen ((ptr)->sun_path))
#endif
但是这不会做到这一点:因为最后两个观察结果是同一个月(&#34; 12月和#34;然后是另一个&#34; 12月和#34;)年度计数增加:< / p>
最后一次观察仍应阅读&#34; 1960&#34;不是&#34; 1959&#34;。
答案 0 :(得分:0)
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才能在这里工作。