我創建了像這樣的data.table。如何使用不同大小的列創建data.table
DT = data.table(A=c(1,2,3), B=c(1,2,3,4,5))
但我得到了這個結果。
A B
1: 1 1
2: 2 2
3: 3 3
4: 1 4
5: 2 5
但我想得到這個。
A B
1: 1 1
2: 2 2
3: 3 3
4: NA 4
5: NA 5
如何創建不同大小的data.table?
我創建了像這樣的data.table。如何使用不同大小的列創建data.table
DT = data.table(A=c(1,2,3), B=c(1,2,3,4,5))
但我得到了這個結果。
A B
1: 1 1
2: 2 2
3: 3 3
4: 1 4
5: 2 5
但我想得到這個。
A B
1: 1 1
2: 2 2
3: 3 3
4: NA 4
5: NA 5
如何創建不同大小的data.table?
install.packages("qpcR")
library(qpcR)
df <- data.table(qpcR:::cbind.na(A=c(1,2,3), B=c(1,2,3,4,5)))
A B
1 1 1
2 2 2
3 3 3
4 NA 4
5 NA 5
我們在list
('lst')中保留不等長度的vector
,然後遍歷list
元素,在末尾附加NA並轉換爲data.table
。
lst <- list(A=c(1,2,3), B=c(1,2,3,4,5))
DT <- setDT(lapply(lst, `length<-`, max(lengths(lst))))[]
DT
# A B
#1: 1 1
#2: 2 2
#3: 3 3
#4: NA 4
#5: NA 5
尼斯和聰明,我從來沒有想到內部的任務*應用函數:c – Llopis
我剛創建的包裝,而不是回收元件,在每個矢量的末尾添加NA
值,以使得所有的輸入向量的長度是相同的:
data.table2 <- function(...) {
args <- list(...)
max_length <- max(sapply(args, length))
foo <- function(x) {
y <- rep(NA, max_length - length(x))
return(c(x, y))
}
new_args <- lapply(args, foo)
do.call(data.table, new_args)
}
data.table2(A=c(1,2,3), B=c(1,2,3,4,5))
> DT
A B
1: 1 1
2: 2 2
3: 3 3
4: NA 4
5: NA 5
不是很可擴展的,但是這個作品,以及:
data.table(A = 1:3)[ , I := .I][data.table(B = 1:5)[ , I := .I], on = "I"]
# A I B
# 1: 1 1 1
# 2: 2 2 2
# 3: 3 3 3
# 4: NA 4 4
# 5: NA 5 5
(追加[ , I := NULL]
刪除添加的列)
完全正確的一次性,但請記住,使用未導出的函數是冒險的 – eddi
@eddi感謝您的更新 –