我刚刚开始学习R了很短的时间。我有下表
Name stDte edDte
A 2010-05-01 2014-12-01
B 2013-06-01 2014-02-01
Run Code Online (Sandbox Code Playgroud)
我需要将其转换成这样的表
Name Dte
A 2010-05-01
A 2010-06-01
A 2010-07-01
...
A 2014-12-01
B 2013-06-01
B 2013-07-01
...
B 2014-02-01
Run Code Online (Sandbox Code Playgroud)
我正在考虑将“ for”循环与rbind结合使用,但是我不确定该怎么做。将不胜感激有关如何做到这一点的任何建议。在此先感谢您的指导
由于您没有另外说明,因此此答案假定stDte和edDte列均为“ Date”类。
在基数R中,您可以Map()用来创建日期序列,然后data.frame在使用创建新Name列之后将新数据框放在一起rep.int()。
M <- Map(seq, df$stDte, df$edDte, by = "month")
df2 <- data.frame(
Name = rep.int(df$Name, vapply(M, length, 1L)),
Dte = do.call(c, M)
)
str(df2)
# 'data.frame': 65 obs. of 2 variables:
# $ Name: Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 1 1 ...
# $ Dte : Date, format: "2010-05-01" "2010-06-01" ...
head(df2, 3)
# Name Dte
# 1 A 2010-05-01
# 2 A 2010-06-01
# 3 A 2010-07-01
tail(df2, 3)
# Name Dte
# 63 B 2013-12-01
# 64 B 2014-01-01
# 65 B 2014-02-01
Run Code Online (Sandbox Code Playgroud)
或者您可以使用data.table包装并做
library(data.table)
setDT(df)[, .(Dte = seq(stDte, edDte, by = "month")), by = Name]
Run Code Online (Sandbox Code Playgroud)