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 valeurby
.
Apparemment, la fonction ne peut pas identifier les paramètres by
avec deux tables de données identiques. Une idée ?
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
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
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
data.table(1)
: Créez un fichier non -NULL
data.table auquel vous pouvez ajouter des colonnes V1
avec une ligne. Valeur 1
NULL
) à la place de 1
[,`:=`(c("va", "vb", "vc"),NA)]
: Ajoutez des colonnes va
, vb
, vc
V1
) et une ligne. valeur 1,NA,NA,NA
NULL
peut être substituée à NA[,V1:=NULL]
: supprime la colonne V1
[.0]
: Retourne une ligne vide 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)]