먼저 동일한 데이터 프레임으로 작업하는 경우 열 이름에 다시 액세스하는 대신 부울 벡터를 사용하여 직접 인덱싱을 사용할 수 있습니다. 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.
마지막으로 서브셋 ()을 사용할 수 있지만 실제로는 코드에서 사용할 수 없습니다 (도움말 파일에서도 경고). 특히 나에게 문제는 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
보너스로 , 여기에 다른 옵션의 작은 벤치 마크가 있는데, 이는 하위 집합이 느리고 첫 번째 재 할당 방법이 더 빠름을 분명히 보여줍니다.
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(...))
내 경우에 vars를 떨어 뜨릴 수 있다고 생각했습니다 . 그러나 문제는 주로paste("data$",var.out[i],sep="")
루프 내부에서 관심있는 열에 액세스 하는 부분에 관한 것 입니다. 열 이름을 붙여 넣거나 어떻게 작성합니까? 관심과 도움을 주신 모든 분들께 감사드립니다