J'ai une table de données avec un tas de colonnes, par exemple:
dt<-data.table(matrix(runif(10*10),10,10))
Je souhaite effectuer certaines opérations sur la table de données, telles que la production d'une matrice de corrélation (cor(dt)
). Pour ce faire, je souhaite supprimer quelques colonnes contenant des valeurs non numériques ou des valeurs situées en dehors d'une certaine plage.
Disons que je veux trouver la matrice de corrélation excluant V1, V2, V3 et V5.
Voici mon approche actuelle:
cols<-!(colnames(dt)=="V1" | colnames(dt)=="V2" | colnames(dt)=="V3" | colnames(dt)=="V5")
new_dt<-subset(dt,,cols)
cor(new_dt)
Je trouve cela assez fastidieux, vu la syntaxe de data.table qui est généralement si élégante. Y a-t-il une meilleure méthode pour faire cela?
Utilisation with=FALSE
:
cols = paste("V", c(1,2,3,5), sep="")
dt[, !cols, with=FALSE]
Je suggère de passer par la "Introduction à data.table" vignette.
Mise à jour: De v1.10.2
à partir de maintenant, vous pouvez aussi faire:
dt[, ..cols]
Voir le premier article de NEWS sous v1.10.2 ici pour plus d'explications.
Tu peux faire
dt[, !c("V1","V2","V3","V5"), with=FALSE]
obtenir
V4 V6 V7 V8 V9 V10
1: 0.88612076 0.94727825 0.50502208 0.6702523 0.24186706 0.96263313
2: 0.11121752 0.13969145 0.19092645 0.9589867 0.27968190 0.07796870
3: 0.50179822 0.10641301 0.08540322 0.3297847 0.03643195 0.18082180
4: 0.09787517 0.07312777 0.88077548 0.3218041 0.75826099 0.55847774
5: 0.73475574 0.96644484 0.58261312 0.9921499 0.78962675 0.04976212
6: 0.88861117 0.85690337 0.27723130 0.3662264 0.50881663 0.67402625
7: 0.33933983 0.83392047 0.30701697 0.6138122 0.85107176 0.58609504
8: 0.89907094 0.61389815 0.19957386 0.3968331 0.78876682 0.90546328
9: 0.54136123 0.08274569 0.25190790 0.1920462 0.15142604 0.12134807
10: 0.36511064 0.88117171 0.05730210 0.9441072 0.40125023 0.62828674
Une autre alternative à l'utilisation de with=FALSE
est d'utiliser .SDcols
cols = paste("V", c(1,2,3,5), sep="")
dt[, .SD, .SDcols=-cols]
Cela semble être une amélioration:
> cols<-!(colnames(dt) %in% c("V1","V2","V3","V5"))
> new_dt<-subset(dt,,cols)
> cor(new_dt)
V4 V6 V7 V8 V9 V10
V4 1.0000000 0.14141578 -0.44466832 0.23697216 -0.1020074 0.48171747
V6 0.1414158 1.00000000 -0.21356218 -0.08510977 -0.1884202 -0.22242274
V7 -0.4446683 -0.21356218 1.00000000 -0.02050846 0.3209454 -0.15021528
V8 0.2369722 -0.08510977 -0.02050846 1.00000000 0.4627034 -0.07020571
V9 -0.1020074 -0.18842023 0.32094540 0.46270335 1.0000000 -0.19224973
V10 0.4817175 -0.22242274 -0.15021528 -0.07020571 -0.1922497 1.00000000
Celui-ci n'est pas aussi facile à comprendre, mais pourrait être utile dans certaines situations où il était nécessaire de spécifier les colonnes à l'aide d'un vecteur numérique:
subset(dt, , !grepl(paste0("V", c(1:3,5),collapse="|"),colnames(dt) ))
Option utilisant dplyr
require(dplyr)
dt<-as.data.frame(matrix(runif(10*10),10,10))
dt <- select(dt, -V1, -V2, -V3, -V4)
cor(dt)
S'il n'est pas obligatoire de spécifier des noms de colonne:
> cor(dt[, !c(1:3, 5)])
V4 V6 V7 V8 V9 V10
V4 1.00000000 -0.50472635 -0.07123705 0.9089868 -0.17232607 -0.77988709
V6 -0.50472635 1.00000000 0.05757776 -0.2374420 0.67334474 0.29476983
V7 -0.07123705 0.05757776 1.00000000 -0.1812176 -0.36093750 0.01102428
V8 0.90898683 -0.23744196 -0.18121755 1.0000000 0.21372140 -0.75798418
V9 -0.17232607 0.67334474 -0.36093750 0.2137214 1.00000000 -0.01179544
V10 -0.77988709 0.29476983 0.01102428 -0.7579842 -0.01179544 1.00000000
Vous pouvez faire un sous-ensemble par index de colonne (pour éviter de taper leurs noms)
dt[, names(dt)[c(-1, -2, -3, -5)], with = FALSE]
le résultat semble ok
V4 V6 V7 V8 V9 V10
1: 0.51500037 0.919066234 0.49447244 0.19564261 0.51945102 0.7238604
2: 0.36477648 0.828889808 0.04564637 0.20265215 0.32255945 0.4483778
3: 0.10853112 0.601278633 0.58363636 0.47807015 0.58061000 0.2584015
4: 0.57569100 0.228642846 0.25734995 0.79528506 0.52067802 0.6644448
5: 0.07873759 0.840349039 0.77798153 0.48699653 0.98281006 0.4480908
6: 0.31347303 0.670762371 0.04591664 0.03428055 0.35916057 0.1297684
7: 0.45374290 0.957848949 0.99383496 0.43939774 0.33470618 0.9429592
8: 0.99403107 0.009750809 0.78816609 0.34713435 0.57937680 0.9227709
9: 0.62776909 0.400467655 0.49433474 0.81536420 0.01637135 0.4942351
10: 0.10318372 0.177712847 0.27678497 0.59554454 0.29532020 0.7117959