web-dev-qa-db-fra.com

Comment créer un datatable vide avec des noms de colonnes puis y ajouter des datatables?

Tout d'abord, je veux créer un datatable vide avec des noms de colonne mais cela échoue:

data=data.table(va, vb, vc)

Erreur dans data.table (va, vb, vc): objet 'va' introuvable

Ensuite, je veux y ajouter des tables de données, mais cela échoue aussi:

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
merge(data2,data2)

Erreur dans merge.data.table (data2, data2): Impossible de faire correspondre les clés dans x et y pour déterminer automatiquement le paramètre by approprié. Veuillez définir explicitement la valeur by.

Apparemment, la fonction ne peut pas identifier les paramètres by avec deux tables de données identiques. Une idée ?

9
ChiseledAbs

Pour créer un data.table vide (en supposant que toutes les colonnes sont numériques):

library(data.table)    
data=data.table(va=numeric(), vb=numeric(), vc=numeric())
data

qui se traduit par:

> data
Empty data.table (0 rows) of 3 cols: va,vb,vc

Pour faire une auto-jointure sur toutes les colonnes, utilisez (même si le résultat est le même ;-):

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
merge(data2,data2,by=names(data2))

La raison pour laquelle vous devez spécifier le paramètre by est la sémantique documentée de merge:

par:

Un vecteur de noms de colonnes partagés dans x et y à fusionner. Cette valeur par défaut aux colonnes de clé partagée entre les deux tables. Si y n'a pas de clé colonnes, par défaut à la clé de x.

Étant donné que vous n'avez défini aucune clé, les colonnes "rejoindre" pour fusionner les tables de données ne sont pas claires.

Il n'y a pas de sémantique implicite "utiliser toutes les colonnes" si vous omettez le paramètre by. Si vous estimez que cela constitue une lacune, veuillez adresser une demande de modification aux auteurs du package data.table.

Pour ajouter toutes les lignes d'un fichier data.table à un autre, utilisez rbind ("row bind") au lieu de merge:

data3 <- rbind(data2,data2)
data3

Ce qui résulte en:

> data3
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
4: -1 -1 -1
5:  0  0  0
6:  1  1  1
13
R Yoda

Pour créer un fichier data.table vide, vous pouvez partir d'une matrice vide:

library(data.table)
data <- setNames(data.table(matrix(nrow = 0, ncol = 3)), c("va", "vb", "vc"))
data
Empty data.table (0 rows) of 3 cols: va,vb,vc

Ensuite, vous pouvez utiliser rbindlist pour y ajouter un nouveau fichier data.table:

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
rbindlist(list(data, data2))
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1

Ou même plus simple, ce qui suit fonctionne aussi:

data <- data.table()
data <- rbindlist(list(data, data2))
data
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
11
Psidom

Une autre façon de créer un fichier data.table vide avec des noms de colonne définis mais sans avoir à définir des types de données:

data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]

Cela fait ce qui suit

  1. data.table(1): Créez un fichier non -NULL data.table auquel vous pouvez ajouter des colonnes
    • A une colonne V1 avec une ligne. Valeur 1
    • Vous pouvez utiliser n’importe quelle valeur (autre que NULL) à la place de 1
  2. [,`:=`(c("va", "vb", "vc"),NA)]: Ajoutez des colonnes va, vb, vc
    • A maintenant quatre colonnes (commençant par V1) et une ligne. valeur 1,NA,NA,NA
    • Toute valeur non -NULL peut être substituée à NA
  3. [,V1:=NULL]: supprime la colonne V1
  4. [.0]: Retourne une ligne vide
    • Vous pouvez réellement utiliser [. n ] où n est n’importe quel nombre entier

Si vous n'aimez pas la magie noire de [.0], vous pouvez aussi utiliser

data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]
0
mpag