data.table 避免回收
data.table avoid recycling
我正在从两个(或更多)不同长度的输入向量构建 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
有没有办法在将较短的向量传递给 data.table()
构造函数之前用 NA
显式填充较短的向量?
谢谢!
一个选项是 cbind.fill
来自 rowr
library(rowr)
setNames(cbind.fill(x, y, fill = NA), c("x", "y"))
或将vector
放在list
中,然后根据list
元素的最大长度在末尾填充NA
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
可以使用 超出范围 索引:
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)
jogo 提供的 "out of range indices" 答案可以使用 .N
:
干净地扩展到 in-place 赋值
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])
z <- c(6,7)
dt[, z := z[1:.N]]
# x y z
# 1: 1 8 6
# 2: 2 9 7
# 3: 3 NA NA
# 4: 4 NA NA
我正在从两个(或更多)不同长度的输入向量构建 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
有没有办法在将较短的向量传递给 data.table()
构造函数之前用 NA
显式填充较短的向量?
谢谢!
一个选项是 cbind.fill
来自 rowr
library(rowr)
setNames(cbind.fill(x, y, fill = NA), c("x", "y"))
或将vector
放在list
中,然后根据list
元素的最大长度在末尾填充NA
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
可以使用 超出范围 索引:
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)
jogo 提供的 "out of range indices" 答案可以使用 .N
:
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])
z <- c(6,7)
dt[, z := z[1:.N]]
# x y z
# 1: 1 8 6
# 2: 2 9 7
# 3: 3 NA NA
# 4: 4 NA NA