dplyr
함수는 data.table
s에서 작동 하므로 여기에 dplyr
"for 루프를 피하는"솔루션이 있습니다. :)
dt %>% mutate(across(all_of(cols), ~ -1 * .))
나는 오르한의 코드 (행과 열을 추가)을 사용하여 벤치마킹 당신은 볼 dplyr::mutate
과 함께 across
주로 빨리 다른 솔루션의 대부분에 비해 속도가 느린 lapply 사용하여 data.table 솔루션보다 실행합니다.
library(data.table); library(dplyr)
dt <- data.table(a = 1:100000, b = 1:100000, d = 1:100000) %>%
mutate(a2 = a, a3 = a, a4 = a, a5 = a, a6 = a)
cols <- c("a", "b", "a2", "a3", "a4", "a5", "a6")
dt %>% mutate(across(all_of(cols), ~ -1 * .))
library(microbenchmark)
mbm = microbenchmark(
base_with_forloop = for (col in 1:length(cols)) {
dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
},
franks_soln1_w_lapply = dt[ , (cols) := lapply(.SD, "*", -1), .SDcols = cols],
franks_soln2_w_forloop = for (j in cols) set(dt, j = j, value = -dt[[j]]),
orhans_soln_w_forloop = for (j in cols) dt[,(j):= -1 * dt[, ..j]],
orhans_soln2 = dt[,(cols):= - dt[,..cols]],
dplyr_soln = (dt %>% mutate(across(all_of(cols), ~ -1 * .))),
times=1000
)
library(ggplot2)
ggplot(mbm) +
geom_violin(aes(x = expr, y = time)) +
coord_flip()
reprex 패키지 (v0.3.0)로 2020-10-16에 생성
set
로모그래퍼for-loop
. 더 빠를 것 같아요.