Đầu tiên , bạn có thể sử dụng lập chỉ mục trực tiếp (với vectơ booleans) thay vì truy cập lại tên cột nếu bạn đang làm việc với cùng một khung dữ liệu; Nó sẽ an toàn hơn như được chỉ ra bởi Ista, và nhanh hơn để viết và thực hiện. Vì vậy, những gì bạn sẽ chỉ cần là:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
và sau đó, chỉ cần gán lại dữ liệu:
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
Thứ hai , viết nhanh hơn, bạn có thể gán trực tiếp NULL cho các cột bạn muốn xóa:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
Cuối cùng , bạn có thể sử dụng tập hợp con (), nhưng nó thực sự không thể được sử dụng trong mã (ngay cả tệp trợ giúp cũng cảnh báo về nó). Cụ thể, một vấn đề với tôi là nếu bạn muốn sử dụng trực tiếp tính năng thả xuống của susbset () bạn cần viết mà không trích dẫn biểu thức tương ứng với tên cột:
subset( data, select = -c("iden", "name", "x_serv", "m_serv") ) # WILL NOT WORK
subset( data, select = -c(iden, name, x_serv, m_serv) ) # WILL
Như một phần thưởng , đây là điểm chuẩn nhỏ của các tùy chọn khác nhau, điều đó cho thấy rõ rằng tập hợp con chậm hơn và phương pháp gán lại đầu tiên là nhanh hơn:
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
Mã dưới đây:
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(...))
sẽ giúp trong trường hợp của tôi để thả bình. câu hỏi mặc dù chủ yếu là vềpaste("data$",var.out[i],sep="")
phần để truy cập các cột quan tâm trong vòng lặp. Làm thế nào tôi có thể dán hoặc bằng cách nào đó soạn một tên cột? Cảm ơn tất cả mọi người vì sự quan tâm và giúp đỡ của bạn