Pertama , Anda dapat menggunakan pengindeksan langsung (dengan vektor booleans) alih-alih mengakses kembali nama kolom jika Anda bekerja dengan bingkai data yang sama; itu akan lebih aman seperti yang ditunjukkan oleh Ista, dan lebih cepat untuk menulis dan mengeksekusi. Jadi yang Anda butuhkan hanyalah:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
dan kemudian, cukup menetapkan kembali data:
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
Kedua , lebih cepat menulis, Anda dapat langsung menetapkan NULL ke kolom yang ingin Anda hapus:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
Terakhir , Anda dapat menggunakan subset (), tetapi itu tidak benar-benar dapat digunakan dalam kode (bahkan file bantuan memperingatkannya). Secara khusus, masalah bagi saya adalah bahwa jika Anda ingin secara langsung menggunakan fitur drop dari susbset () Anda perlu menulis tanpa mengutip ekspresi yang sesuai dengan nama kolom:
subset( data, select = -c("iden", "name", "x_serv", "m_serv") ) # WILL NOT WORK
subset( data, select = -c(iden, name, x_serv, m_serv) ) # WILL
Sebagai bonus , berikut ini adalah tolok ukur kecil dari opsi yang berbeda, yang dengan jelas menunjukkan bahwa himpunan bagian lebih lambat, dan bahwa metode pengalihan yang pertama lebih cepat:
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
Kode di bawah ini:
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(...))
membantu dalam kasus saya untuk menjatuhkan vars. pertanyaannya terutama tentangpaste("data$",var.out[i],sep="")
bagian untuk mengakses kolom yang menarik di dalam loop. bagaimana saya bisa menempel atau entah bagaimana menulis nama kolom? Terima kasih kepada semua orang atas perhatian dan bantuan Anda