我的数据包含日期列:
library(data.table)
library(lubridate)
Y = data.table(X = c("2012-12-31", "2021-10-31"))
X
1: 2012-12-31
2: 2021-10-31
我想给“X”列中的日期添加一个月份序列,从1到x
。结果应该是一组新列,“X_1”,“X_2”,...“X_x”:
X X_1 X_2 X_x
1: 2012-12-31 2013-01-31 2013-02-28 .. (2012-12-31) %m+% months(x)
2: 2021-10-31 2021-11-30 2021-12-31 .. (2021-10-31) %m+% months(x)
我试过几种方法都不起作用,例如:
Y[ , c(paste0("X_", 1:15))] = AddMonths(Y$X, c(1:15)) %>% LastDayInMonth()
Y[ , c(paste0("X_", 1:15)) := AddMonths(as.IDate(X), c(1:15)) %>% LastDayInMonth()]
我想在这个操作的基础上创建15列,所以我想避免for
循环,我的真实的数据有80K行。
4条答案
按热度按时间jvlzgdj91#
%m+%
和months
都是矢量化的。设置要添加到日期列中每个值的序列中的最大月数(例如
n = 3
)。创建一个列名称向量,结果将分配给该向量(nm = paste0("x", "_", seq(n))
)。创建要添加的月份的向量(m = rep(seq(n), each = nrow(d))
)添加到日期列。将"m"中的月份添加到"x"中的日期(x %m+% months(m)
)。将结果除以添加的月数使用data.table
的基本属性"* 列表中的每个元素都成为结果data.table
* 中的一列",并通过引用(:=
)指定结果列。uqdfh47h2#
由于问题标记为
dplyr
,我假设tidyverse
也是允许的。从你的两个约会开始。
以
date
为输入的函数从开始月份添加附加参数中选择的月份数。然后,该函数与
map
一起应用于初始日期列表,然后将其转换为data.frame
。n=6
*im9ewurl3#
请检查此代码
创建于2023年1月28日,使用reprex v2.0.2
pdtvr36n4#
**更新:**我粘贴了错误版本的答案:
months(1)
应为months(i-1)
。现已更正。在for循环中,我们可以这样做: