首先,如果使用相同的数据框,则可以使用直接索引(带有布尔向量),而不是重新访问列名。正如Ista所指出的那样,它会更安全,并且编写和执行起来也会更快。因此,您只需要:
var.out.bool <- !names(data) %in% c("iden", "name", "x_serv", "m_serv")
然后,只需重新分配数据即可:
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
其次,编写起来更快,您可以将NULL直接分配给要删除的列:
data[c("iden", "name", "x_serv", "m_serv")] <- list(NULL) # You need list() to respect the target structure.
最后,您可以使用subset(),但实际上不能在代码中使用它(即使帮助文件也对此有所警告)。具体地说,对我来说,一个问题是,如果您想直接使用susbset()的放置功能,则需要编写不带引号的与列名称相对应的表达式:
subset( data, select = -c("iden", "name", "x_serv", "m_serv") ) # WILL NOT WORK
subset( data, select = -c(iden, name, x_serv, m_serv) ) # WILL
另外,这是各种选项的小型基准测试,它清楚地表明subset较慢,而第一种重新分配方法则更快:
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
代码如下:
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(...))
对我删除var很有帮助。但是,问题主要是关于paste("data$",var.out[i],sep="")
在循环内访问感兴趣的列的部分。如何粘贴或以某种方式组成列名?感谢大家的关注和帮助