2016-10-03 70 views
2

我創建了像這樣的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?

回答

2
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 
+0

完全正確的一次性,但請記住,使用未導出的函數是冒險的 – eddi

+0

@eddi感謝您的更新 –

6

我們在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 
+2

尼斯和聰明,我從來沒有想到內部的任務*應用函數:c – Llopis

1

我剛創建的包裝,而不是回收元件,在每個矢量的末尾添加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 
0

不是很可擴展的,但是這個作品,以及:

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]刪除添加的列)

相關問題