Erste Wenn Sie mit demselben Datenrahmen arbeiten, können Sie die direkte Indizierung (mit Booleschen Vektoren) anstelle des erneuten Zugriffs auf Spaltennamen verwenden; dies ist sicherer, wie von Ista erwähnt, und schneller zu schreiben und auszuführen. Was Sie also brauchen, ist nur:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
und dann einfach die Daten neu zuordnen:
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
Zweite Sie können den Spalten, die Sie entfernen möchten, direkt NULL zuweisen, was schneller geht:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
Endlich können Sie subset() verwenden, aber es kann nicht wirklich im Code verwendet werden (sogar die Hilfedatei warnt davor). Besonders problematisch ist für mich, dass man, wenn man die Drop-Funktion von susbset() direkt nutzen will, den Ausdruck, der den Spaltennamen entspricht, ohne Anführungszeichen schreiben muss:
subset( data, select = -c("iden", "name", "x_serv", "m_serv") ) # WILL NOT WORK
subset( data, select = -c(iden, name, x_serv, m_serv) ) # WILL
Als Bonus Hier ist ein kleiner Vergleich der verschiedenen Optionen, der deutlich zeigt, dass die Teilmenge am langsamsten ist und dass die erste, neu zugewiesene Methode am schnellsten ist:
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
Code ist unten:
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)