我对 R 相当陌生,我正在尝试创建一个循环以在我的数据框中添加日期列,该列按天增加到设定的日期。
我的数据如下所示:
'A' 'B' 'C'
1 2 3
1 2 3
4 5 6
4 5 6
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加一个日期列,因此数据如下所示:
'A' 'B' 'C' 'Date'
1 2 3 1/1
1 2 3 1/1
4 5 6 1/1
4 5 6 1/1
1 2 3 1/2
1 2 3 1/2
4 5 6 1/2
4 5 6 1/2
1 2 3 1/3
1 2 3 1/3
4 5 6 1/3
4 5 6 1/3
Run Code Online (Sandbox Code Playgroud)
我感谢任何帮助!
要复制您的问题,我们将首先创建您的数据:
df = data.frame(a = c(1,1,4,4), b = c(2,2,5,5), c = c(3,3,6,6))
Run Code Online (Sandbox Code Playgroud)
您复制您的数据串的每一个值,即呈现值1/1,1/2,1/3和1/4
# construct the values
values = paste("1", 1:4, sep = "/")
Run Code Online (Sandbox Code Playgroud)
如果我们将这些值每个重复 4 次(4 是原始数据中的行数)并将其作为一列添加到原始数据中,则其他行将被“回收” - 它们的值重复 - 以匹配相同的长度:
# could change to `each = nrow(df)` to be more general
cbind(df, date = rep(values, each = 4))
# a b c date
# 1 1 2 3 1/1
# 2 1 2 3 1/1
# 3 4 5 6 1/1
# 4 4 5 6 1/1
# 5 1 2 3 1/2
# 6 1 2 3 1/2
# 7 4 5 6 1/2
# 8 4 5 6 1/2
# 9 1 2 3 1/3
# 10 1 2 3 1/3
# 11 4 5 6 1/3
# 12 4 5 6 1/3
Run Code Online (Sandbox Code Playgroud)
这些不是日期,它们只是字符串。
Date类对象如果你想要类的日期Date,它们可以用 来创建as.Date,并且seq可以用来创建一个Dates的序列。通过修改values上面的定义,我们可以使用Dateclass 来代替,其余代码保持不变。
values = seq(from = as.Date("2017-01-01"), to = as.Date("2017-01-03"), by = 'day')
Run Code Online (Sandbox Code Playgroud)
merge代替回收组合数据和日期的另一种选择是merge用于交叉连接。使用merge我们不需要担心原始数据的大小:
merge(df, values, all = T)
# a b c y
# 1 1 2 3 2017-01-01
# 2 1 2 3 2017-01-01
# 3 4 5 6 2017-01-01
# 4 4 5 6 2017-01-01
# 5 1 2 3 2017-01-02
# 6 1 2 3 2017-01-02
# 7 4 5 6 2017-01-02
# 8 4 5 6 2017-01-02
# 9 1 2 3 2017-01-03
# 10 1 2 3 2017-01-03
# 11 4 5 6 2017-01-03
# 12 4 5 6 2017-01-03
Run Code Online (Sandbox Code Playgroud)
这有点通用,如果您需要添加多列而不是单个向量,这将很有用。