为向量中的每个值在data.table中创建一列

时间:2019-05-20 07:58:20

标签: r data.table

我想将向量中的日期添加到现有数据表中。向量中的每个日期应输入不同的列中。我正在尝试对包含任意数量日期的向量执行此操作-因此基本上我想要长度为n的向量的通用代码。我通过以下方式执行此操作:

someDates  <- c(as.Date('2019-1-31'), as.Date('2019-3-30'))
newColumns <- paste0('col', 1:length(someDates))

date_column <- c(as.Date('2018-12-31'), as.Date('2018-11-30'), as.Date('2017-09-30'), as.Date('2016-01-30'))
some_column <- letters[1:4]

DT <- data.table(date_column, some_column)

DT[, (newColumns) := as.data.table(matrix(rep(someDates, each = nrow(DT)), nr = nrow(DT)))]
DT[, (newColumns) := lapply(.SD, as.Date), .SDcols = newColumns]

我在第一步中没有发现函数matrix的使用,但最后一步非常漂亮-我也不喜欢后来必须转换为日期的事实。我可以更优雅的方式获得相同的结果吗?

1 个答案:

答案 0 :(得分:3)

您可以使用as.list

library(data.table)

DT[, (newColumns) := as.list(someDates)]

DT
#   date_column some_column       col1       col2
#1:  2018-12-31           a 2019-01-31 2019-03-30
#2:  2018-11-30           b 2019-01-31 2019-03-30
#3:  2017-09-30           c 2019-01-31 2019-03-30
#4:  2016-01-30           d 2019-01-31 2019-03-30

检查str(DT),以确保新列属于Date类。

str(DT)
#Classes ‘data.table’ and 'data.frame': 4 obs. of  4 variables:
# $ date_column: Date, format: "2018-12-31" "2018-11-30" "2017-09-30" "2016-01-30"
# $ some_column: chr  "a" "b" "c" "d"
# $ col1       : Date, format: "2019-01-31" "2019-01-31" "2019-01-31" "2019-01-31"
# $ col2       : Date, format: "2019-03-30" "2019-03-30" "2019-03-30" "2019-03-30"
# - attr(*, ".internal.selfref")=<externalptr>