繁体   English   中英

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明确填充较短的向量?

谢谢!

可以使用超出范围的索引:

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.fillrowr

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

或者将vector s放在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

jogo提供的“超出范围索引”答案可以使用.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM