Tout d'abord , vous pouvez utiliser l'indexation directe (avec des vecteurs booléens) au lieu de ré-accéder aux noms de colonne si vous travaillez avec le même bloc de données; il sera plus sûr comme l'a souligné Ista, et plus rapide à écrire et à exécuter. Donc, vous n'aurez besoin que de:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
puis, réaffectez simplement les données:
data <- data[,var.out.bool] # or...
data <- data[,var.out.bool, drop = FALSE] # You will need this option to avoid the conversion to an atomic vector if there is only one column left
Deuxièmement , plus rapide à écrire, vous pouvez directement affecter NULL aux colonnes que vous souhaitez supprimer:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
Enfin , vous pouvez utiliser subset (), mais il ne peut pas vraiment être utilisé dans le code (même le fichier d'aide vous en avertit). Plus précisément, un problème pour moi est que si vous souhaitez utiliser directement la fonction drop de susbset (), vous devez écrire sans guillemets l'expression correspondant aux noms de colonne:
subset( data, select = -c("iden", "name", "x_serv", "m_serv") ) # WILL NOT WORK
subset( data, select = -c(iden, name, x_serv, m_serv) ) # WILL
En bonus , voici un petit benchmark des différentes options, qui montre clairement que le sous-ensemble est le plus lent, et que la première méthode de réaffectation est la plus rapide:
re_assign(dtest, drop_vec) 46.719 52.5655 54.6460 59.0400 1347.331
null_assign(dtest, drop_vec) 74.593 83.0585 86.2025 94.0035 1476.150
subset(dtest, select = !names(dtest) %in% drop_vec) 106.280 115.4810 120.3435 131.4665 65133.780
subset(dtest, select = names(dtest)[!names(dtest) %in% drop_vec]) 108.611 119.4830 124.0865 135.4270 1599.577
subset(dtest, select = -c(x, y)) 102.026 111.2680 115.7035 126.2320 1484.174
Le code est ci-dessous:
dtest <- data.frame(x=1:5, y=2:6, z = 3:7)
drop_vec <- c("x", "y")
null_assign <- function(df, names) {
df[names] <- list(NULL)
df
}
re_assign <- function(df, drop) {
df <- df [, ! names(df) %in% drop, drop = FALSE]
df
}
res <- microbenchmark(
re_assign(dtest,drop_vec),
null_assign(dtest,drop_vec),
subset(dtest, select = ! names(dtest) %in% drop_vec),
subset(dtest, select = names(dtest)[! names(dtest) %in% drop_vec]),
subset(dtest, select = -c(x, y) ),
times=5000)
plt <- ggplot2::qplot(y=time, data=res[res$time < 1000000,], colour=expr)
plt <- plt + ggplot2::scale_y_log10() +
ggplot2::labs(colour = "expression") +
ggplot2::scale_color_discrete(labels = c("re_assign", "null_assign", "subset_bool", "subset_names", "subset_drop")) +
ggplot2::theme_bw(base_size=16)
print(plt)
subset(data, select=c(...))
aide dans mon cas pour la suppression de vars. la question était cependant principalement sur lapaste("data$",var.out[i],sep="")
partie pour accéder aux colonnes d'intérêt à l'intérieur de la boucle. comment puis-je coller ou composer en quelque sorte un nom de colonne? Merci à tous pour votre attention et votre aide