данные.таблица избегайте переработки
Я строю 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 ответа:
Можно использовать вне диапазона индексы:
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"))
Или поместите
vector
s вlist
, а затем padNA
в конце, основываясь на максимальной длине элементов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