данные.таблица избегайте переработки


Я строю data.table из двух (или более) входных векторов разной длины:

x <- c(1,2,3,4)
y <- c(8,9)

dt <- data.table(x = x, y = y)

И нужно, чтобы более короткие векторы были заполнены NA вместо того, чтобы повторно использовать их значения, что приводит к data.table, как это:

   x  y
1: 1  8
2: 2  9
3: 3 NA
4: 4 NA

Есть ли способ достичь этого без явного заполнения более коротких векторов NA перед их передачей конструктору data.table()?

Спасибо!

2 6

2 ответа:

Можно использовать вне диапазона индексы:

library("data.table")

x <- c(1,2,3,4)
y <- c(8,9)
n <- max(length(x), length(y))

dt <- data.table(x = x[1:n], y = y[1:n])
# > dt
#    x  y
# 1: 1  8
# 2: 2  9
# 3: 3 NA
# 4: 4 NA

Или вы можете расширить y, сделав (как @ Roland рекомендовал в комментарии):

length(y) <- length(x) <- max(length(x), length(y))
dt <- data.table(x, y)

Вариант cbind.fill из rowr

library(rowr)
setNames(cbind.fill(x, y, fill = NA), c("x", "y"))

Или поместите vectors в list, а затем pad NA в конце, основываясь на максимальной длине элементов list

library(data.table)
lst <- list(x = x, y = y)
as.data.table(lapply(lst, `length<-`, max(lengths(lst))))
#   x  y
#1: 1  8
#2: 2  9
#3: 3 NA
#4: 4 NA