Erstens können Sie die direkte Indizierung (mit Booleschen Vektoren) verwenden, anstatt erneut auf Spaltennamen zuzugreifen, wenn Sie mit demselben Datenrahmen arbeiten. Wie Ista betont, ist es sicherer und schneller zu schreiben und auszuführen. Sie brauchen also nur:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
und dann einfach Daten neu zuweisen:
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
Zweitens können Sie schneller zu schreiben den Spalten, die Sie entfernen möchten, direkt NULL zuweisen:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
Schließlich können Sie subset () verwenden, es kann jedoch nicht wirklich im Code verwendet werden (selbst die Hilfedatei warnt davor). Insbesondere besteht für mich ein Problem darin, dass Sie den Ausdruck, der den Spaltennamen entspricht, ohne Anführungszeichen schreiben müssen, wenn Sie die Drop-Funktion von susbset () direkt verwenden möchten:
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 gibt es hier einen kleinen Benchmark der verschiedenen Optionen, der deutlich zeigt, dass die Teilmenge langsamer und die erste Methode zur Neuzuweisung schneller 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)
subset(data, select=c(...))
in meinem Fall hilft, Vars fallen zu lassen. Die Frage betraf jedoch hauptsächlich denpaste("data$",var.out[i],sep="")
Teil für den Zugriff auf interessierende Spalten innerhalb der Schleife. Wie kann ich einen Spaltennamen einfügen oder irgendwie zusammensetzen? Vielen Dank an alle für Ihre Aufmerksamkeit und Ihre Hilfe