İlk olarak , aynı veri çerçevesiyle çalışıyorsanız sütun adlarına yeniden erişmek yerine doğrudan dizin oluşturmayı (booleans vektörleriyle) kullanabilirsiniz; Ista'nın işaret ettiği gibi daha güvenli olacak ve yazmak ve yürütmek daha hızlı olacaktır. Tek ihtiyacınız olan şey:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
ve daha sonra, verileri yeniden atamanız yeterlidir:
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
İkincisi , yazmak daha hızlı, kaldırmak istediğiniz sütunlara doğrudan NULL atayabilirsiniz:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
Son olarak , subset () kullanabilirsiniz, ancak kodda gerçekten kullanılamaz (yardım dosyası bile uyarır). Özellikle, benim için bir sorun, susbset () 'in drop özelliğini doğrudan kullanmak istiyorsanız, sütun adlarına karşılık gelen ifadeyi tırnak işaretleri olmadan yazmanız gerektiğidir:
subset( data, select = -c("iden", "name", "x_serv", "m_serv") ) # WILL NOT WORK
subset( data, select = -c(iden, name, x_serv, m_serv) ) # WILL
Bir bonus olarak , alt seçeneklerin daha yavaş olduğunu ve ilk yeniden atama yönteminin daha hızlı olduğunu açıkça gösteren farklı seçeneklerin küçük bir ölçütü:
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
Kod aşağıdadır:
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(...))
, benim durumumda vars bırakarak yardımcı olduğunu düşünüyordum . bununla birlikte, soru esaspaste("data$",var.out[i],sep="")
olarak döngü içindeki ilgili sütunlara erişme kısmıydı. nasıl bir sütun adı yapıştırabilir veya oluşturabilirim? İlginiz ve yardımınız için herkese teşekkürler