6
votes

Comment créer des données.Table avec une taille différente des colonnes

Je crée des données.Table comme ceci. xxx pré>

mais je reçois ce résultat. p> xxx pré>

mais j'aimerais obtenir ceci. P>

   A B
1: 1 1
2: 2 2
3: 3 3
4: NA 4
5: NA 5


0 commentaires

4 Réponses :


7
votes

Nous conservons le vecteur code> de la longueur inégale dans une liste code> (code> ('lst'), puis boucle via la liste code> éléments, appendez NA à la fin et convertir en data.Table code>.

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


1 commentaires

Nice et intelligente, je ne pense jamais aux missions à l'intérieur * Appliquer des fonctions: c



1
votes

Je viens de créer une enveloppe qui, au lieu d'éléments de recyclage, ajoute des valeurs na code> à la fin de chaque vecteur de sorte que la longueur de tous les vecteurs d'entrée soit la même:

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 commentaires

2
votes
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

1 commentaires

Totalement bien comme un ponctuel, mais gardez à l'esprit que l'utilisation de fonctions inexportées est plus risquée.



0
votes

pas très extensible, mais cela fonctionne aussi bien:

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


0 commentaires